diff options
author | <jejb@mulgrave.(none)> | 2005-04-03 05:57:48 -0400 |
---|---|---|
committer | James Bottomley <jejb@titanic> | 2005-04-16 21:09:43 -0400 |
commit | 56fece20086ebe32bce2c0d74ceadd516b56baae (patch) | |
tree | 3ce88fad34483bfc393feb2ee5f3a7f4b8a17f0b /drivers/scsi | |
parent | e183b06bf0be6c525867476df186d20f8f1efe54 (diff) |
[PATCH] finally fix 53c700 to use the generic iomem infrastructure
This driver has had it's own different infrastructure for doing this for
ages, but it's time it used the common one.
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/53c700.c | 3 | ||||
-rw-r--r-- | drivers/scsi/53c700.h | 192 | ||||
-rw-r--r-- | drivers/scsi/Kconfig | 10 | ||||
-rw-r--r-- | drivers/scsi/NCR_D700.c | 5 | ||||
-rw-r--r-- | drivers/scsi/lasi700.c | 1 | ||||
-rw-r--r-- | drivers/scsi/sim710.c | 5 |
6 files changed, 27 insertions, 189 deletions
diff --git a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c index a591fcb8aab1..4b1bb529f676 100644 --- a/drivers/scsi/53c700.c +++ b/drivers/scsi/53c700.c | |||
@@ -389,8 +389,7 @@ NCR_700_detect(struct scsi_host_template *tpnt, | |||
389 | host->max_lun = NCR_700_MAX_LUNS; | 389 | host->max_lun = NCR_700_MAX_LUNS; |
390 | BUG_ON(NCR_700_transport_template == NULL); | 390 | BUG_ON(NCR_700_transport_template == NULL); |
391 | host->transportt = NCR_700_transport_template; | 391 | host->transportt = NCR_700_transport_template; |
392 | host->unique_id = hostdata->base; | 392 | host->unique_id = (unsigned long)hostdata->base; |
393 | host->base = hostdata->base; | ||
394 | hostdata->eh_complete = NULL; | 393 | hostdata->eh_complete = NULL; |
395 | host->hostdata[0] = (unsigned long)hostdata; | 394 | host->hostdata[0] = (unsigned long)hostdata; |
396 | /* kick the chip */ | 395 | /* kick the chip */ |
diff --git a/drivers/scsi/53c700.h b/drivers/scsi/53c700.h index df4aa30ae0aa..e86012cf6ab7 100644 --- a/drivers/scsi/53c700.h +++ b/drivers/scsi/53c700.h | |||
@@ -14,10 +14,6 @@ | |||
14 | #include <scsi/scsi_device.h> | 14 | #include <scsi/scsi_device.h> |
15 | 15 | ||
16 | 16 | ||
17 | #if defined(CONFIG_53C700_MEM_MAPPED) && defined(CONFIG_53C700_IO_MAPPED) | ||
18 | #define CONFIG_53C700_BOTH_MAPPED | ||
19 | #endif | ||
20 | |||
21 | /* Turn on for general debugging---too verbose for normal use */ | 17 | /* Turn on for general debugging---too verbose for normal use */ |
22 | #undef NCR_700_DEBUG | 18 | #undef NCR_700_DEBUG |
23 | /* Debug the tag queues, checking hash queue allocation and deallocation | 19 | /* Debug the tag queues, checking hash queue allocation and deallocation |
@@ -49,13 +45,6 @@ | |||
49 | /* magic byte identifying an internally generated REQUEST_SENSE command */ | 45 | /* magic byte identifying an internally generated REQUEST_SENSE command */ |
50 | #define NCR_700_INTERNAL_SENSE_MAGIC 0x42 | 46 | #define NCR_700_INTERNAL_SENSE_MAGIC 0x42 |
51 | 47 | ||
52 | /* WARNING: Leave this in for now: the dependency preprocessor doesn't | ||
53 | * pick up file specific flags, so must define here if they are not | ||
54 | * set */ | ||
55 | #if !defined(CONFIG_53C700_IO_MAPPED) && !defined(CONFIG_53C700_MEM_MAPPED) | ||
56 | #error "Config.in must define either CONFIG_53C700_IO_MAPPED or CONFIG_53C700_MEM_MAPPED to use this scsi core." | ||
57 | #endif | ||
58 | |||
59 | struct NCR_700_Host_Parameters; | 48 | struct NCR_700_Host_Parameters; |
60 | 49 | ||
61 | /* These are the externally used routines */ | 50 | /* These are the externally used routines */ |
@@ -184,7 +173,7 @@ struct NCR_700_command_slot { | |||
184 | struct NCR_700_Host_Parameters { | 173 | struct NCR_700_Host_Parameters { |
185 | /* These must be filled in by the calling driver */ | 174 | /* These must be filled in by the calling driver */ |
186 | int clock; /* board clock speed in MHz */ | 175 | int clock; /* board clock speed in MHz */ |
187 | unsigned long base; /* the base for the port (copied to host) */ | 176 | void __iomem *base; /* the base for the port (copied to host) */ |
188 | struct device *dev; | 177 | struct device *dev; |
189 | __u32 dmode_extra; /* adjustable bus settings */ | 178 | __u32 dmode_extra; /* adjustable bus settings */ |
190 | __u32 differential:1; /* if we are differential */ | 179 | __u32 differential:1; /* if we are differential */ |
@@ -199,9 +188,6 @@ struct NCR_700_Host_Parameters { | |||
199 | /* NOTHING BELOW HERE NEEDS ALTERING */ | 188 | /* NOTHING BELOW HERE NEEDS ALTERING */ |
200 | __u32 fast:1; /* if we can alter the SCSI bus clock | 189 | __u32 fast:1; /* if we can alter the SCSI bus clock |
201 | speed (so can negiotiate sync) */ | 190 | speed (so can negiotiate sync) */ |
202 | #ifdef CONFIG_53C700_BOTH_MAPPED | ||
203 | __u32 mem_mapped; /* set if memory mapped */ | ||
204 | #endif | ||
205 | int sync_clock; /* The speed of the SYNC core */ | 191 | int sync_clock; /* The speed of the SYNC core */ |
206 | 192 | ||
207 | __u32 *script; /* pointer to script location */ | 193 | __u32 *script; /* pointer to script location */ |
@@ -246,12 +232,18 @@ struct NCR_700_Host_Parameters { | |||
246 | #ifdef CONFIG_53C700_LE_ON_BE | 232 | #ifdef CONFIG_53C700_LE_ON_BE |
247 | #define bE (hostdata->force_le_on_be ? 0 : 3) | 233 | #define bE (hostdata->force_le_on_be ? 0 : 3) |
248 | #define bSWAP (hostdata->force_le_on_be) | 234 | #define bSWAP (hostdata->force_le_on_be) |
235 | /* This is terrible, but there's no raw version of ioread32. That means | ||
236 | * that on a be board we swap twice (once in ioread32 and once again to | ||
237 | * get the value correct) */ | ||
238 | #define bS_to_io(x) ((hostdata->force_le_on_be) ? (x) : cpu_to_le32(x)) | ||
249 | #elif defined(__BIG_ENDIAN) | 239 | #elif defined(__BIG_ENDIAN) |
250 | #define bE 3 | 240 | #define bE 3 |
251 | #define bSWAP 0 | 241 | #define bSWAP 0 |
242 | #define bS_to_io(x) (x) | ||
252 | #elif defined(__LITTLE_ENDIAN) | 243 | #elif defined(__LITTLE_ENDIAN) |
253 | #define bE 0 | 244 | #define bE 0 |
254 | #define bSWAP 0 | 245 | #define bSWAP 0 |
246 | #define bS_to_io(x) (x) | ||
255 | #else | 247 | #else |
256 | #error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined, did you include byteorder.h?" | 248 | #error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined, did you include byteorder.h?" |
257 | #endif | 249 | #endif |
@@ -455,91 +447,42 @@ struct NCR_700_Host_Parameters { | |||
455 | 447 | ||
456 | 448 | ||
457 | static inline __u8 | 449 | static inline __u8 |
458 | NCR_700_mem_readb(struct Scsi_Host *host, __u32 reg) | 450 | NCR_700_readb(struct Scsi_Host *host, __u32 reg) |
459 | { | ||
460 | const struct NCR_700_Host_Parameters *hostdata __attribute__((unused)) | ||
461 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; | ||
462 | |||
463 | return readb(host->base + (reg^bE)); | ||
464 | } | ||
465 | |||
466 | static inline __u32 | ||
467 | NCR_700_mem_readl(struct Scsi_Host *host, __u32 reg) | ||
468 | { | ||
469 | __u32 value = __raw_readl(host->base + reg); | ||
470 | const struct NCR_700_Host_Parameters *hostdata __attribute__((unused)) | ||
471 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; | ||
472 | #if 1 | ||
473 | /* sanity check the register */ | ||
474 | if((reg & 0x3) != 0) | ||
475 | BUG(); | ||
476 | #endif | ||
477 | |||
478 | return bS_to_cpu(value); | ||
479 | } | ||
480 | |||
481 | static inline void | ||
482 | NCR_700_mem_writeb(__u8 value, struct Scsi_Host *host, __u32 reg) | ||
483 | { | ||
484 | const struct NCR_700_Host_Parameters *hostdata __attribute__((unused)) | ||
485 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; | ||
486 | |||
487 | writeb(value, host->base + (reg^bE)); | ||
488 | } | ||
489 | |||
490 | static inline void | ||
491 | NCR_700_mem_writel(__u32 value, struct Scsi_Host *host, __u32 reg) | ||
492 | { | ||
493 | const struct NCR_700_Host_Parameters *hostdata __attribute__((unused)) | ||
494 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; | ||
495 | |||
496 | #if 1 | ||
497 | /* sanity check the register */ | ||
498 | if((reg & 0x3) != 0) | ||
499 | BUG(); | ||
500 | #endif | ||
501 | |||
502 | __raw_writel(bS_to_host(value), host->base + reg); | ||
503 | } | ||
504 | |||
505 | static inline __u8 | ||
506 | NCR_700_io_readb(struct Scsi_Host *host, __u32 reg) | ||
507 | { | 451 | { |
508 | const struct NCR_700_Host_Parameters *hostdata __attribute__((unused)) | 452 | const struct NCR_700_Host_Parameters *hostdata |
509 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; | 453 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; |
510 | 454 | ||
511 | return inb(host->base + (reg^bE)); | 455 | return ioread8(hostdata->base + (reg^bE)); |
512 | } | 456 | } |
513 | 457 | ||
514 | static inline __u32 | 458 | static inline __u32 |
515 | NCR_700_io_readl(struct Scsi_Host *host, __u32 reg) | 459 | NCR_700_readl(struct Scsi_Host *host, __u32 reg) |
516 | { | 460 | { |
517 | __u32 value = inl(host->base + reg); | 461 | const struct NCR_700_Host_Parameters *hostdata |
518 | const struct NCR_700_Host_Parameters *hostdata __attribute__((unused)) | ||
519 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; | 462 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; |
520 | 463 | __u32 value = ioread32(hostdata->base + reg); | |
521 | #if 1 | 464 | #if 1 |
522 | /* sanity check the register */ | 465 | /* sanity check the register */ |
523 | if((reg & 0x3) != 0) | 466 | if((reg & 0x3) != 0) |
524 | BUG(); | 467 | BUG(); |
525 | #endif | 468 | #endif |
526 | 469 | ||
527 | return bS_to_cpu(value); | 470 | return bS_to_io(value); |
528 | } | 471 | } |
529 | 472 | ||
530 | static inline void | 473 | static inline void |
531 | NCR_700_io_writeb(__u8 value, struct Scsi_Host *host, __u32 reg) | 474 | NCR_700_writeb(__u8 value, struct Scsi_Host *host, __u32 reg) |
532 | { | 475 | { |
533 | const struct NCR_700_Host_Parameters *hostdata __attribute__((unused)) | 476 | const struct NCR_700_Host_Parameters *hostdata |
534 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; | 477 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; |
535 | 478 | ||
536 | outb(value, host->base + (reg^bE)); | 479 | iowrite8(value, hostdata->base + (reg^bE)); |
537 | } | 480 | } |
538 | 481 | ||
539 | static inline void | 482 | static inline void |
540 | NCR_700_io_writel(__u32 value, struct Scsi_Host *host, __u32 reg) | 483 | NCR_700_writel(__u32 value, struct Scsi_Host *host, __u32 reg) |
541 | { | 484 | { |
542 | const struct NCR_700_Host_Parameters *hostdata __attribute__((unused)) | 485 | const struct NCR_700_Host_Parameters *hostdata |
543 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; | 486 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; |
544 | 487 | ||
545 | #if 1 | 488 | #if 1 |
@@ -548,102 +491,7 @@ NCR_700_io_writel(__u32 value, struct Scsi_Host *host, __u32 reg) | |||
548 | BUG(); | 491 | BUG(); |
549 | #endif | 492 | #endif |
550 | 493 | ||
551 | outl(bS_to_host(value), host->base + reg); | 494 | iowrite32(bS_to_io(value), hostdata->base + reg); |
552 | } | ||
553 | |||
554 | #ifdef CONFIG_53C700_BOTH_MAPPED | ||
555 | |||
556 | static inline __u8 | ||
557 | NCR_700_readb(struct Scsi_Host *host, __u32 reg) | ||
558 | { | ||
559 | __u8 val; | ||
560 | |||
561 | const struct NCR_700_Host_Parameters *hostdata __attribute__((unused)) | ||
562 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; | ||
563 | |||
564 | if(hostdata->mem_mapped) | ||
565 | val = NCR_700_mem_readb(host, reg); | ||
566 | else | ||
567 | val = NCR_700_io_readb(host, reg); | ||
568 | |||
569 | return val; | ||
570 | } | ||
571 | |||
572 | static inline __u32 | ||
573 | NCR_700_readl(struct Scsi_Host *host, __u32 reg) | ||
574 | { | ||
575 | __u32 val; | ||
576 | |||
577 | const struct NCR_700_Host_Parameters *hostdata __attribute__((unused)) | ||
578 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; | ||
579 | |||
580 | if(hostdata->mem_mapped) | ||
581 | val = NCR_700_mem_readl(host, reg); | ||
582 | else | ||
583 | val = NCR_700_io_readl(host, reg); | ||
584 | |||
585 | return val; | ||
586 | } | ||
587 | |||
588 | static inline void | ||
589 | NCR_700_writeb(__u8 value, struct Scsi_Host *host, __u32 reg) | ||
590 | { | ||
591 | const struct NCR_700_Host_Parameters *hostdata __attribute__((unused)) | ||
592 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; | ||
593 | |||
594 | if(hostdata->mem_mapped) | ||
595 | NCR_700_mem_writeb(value, host, reg); | ||
596 | else | ||
597 | NCR_700_io_writeb(value, host, reg); | ||
598 | } | ||
599 | |||
600 | static inline void | ||
601 | NCR_700_writel(__u32 value, struct Scsi_Host *host, __u32 reg) | ||
602 | { | ||
603 | const struct NCR_700_Host_Parameters *hostdata __attribute__((unused)) | ||
604 | = (struct NCR_700_Host_Parameters *)host->hostdata[0]; | ||
605 | |||
606 | if(hostdata->mem_mapped) | ||
607 | NCR_700_mem_writel(value, host, reg); | ||
608 | else | ||
609 | NCR_700_io_writel(value, host, reg); | ||
610 | } | ||
611 | |||
612 | static inline void | ||
613 | NCR_700_set_mem_mapped(struct NCR_700_Host_Parameters *hostdata) | ||
614 | { | ||
615 | hostdata->mem_mapped = 1; | ||
616 | } | ||
617 | |||
618 | static inline void | ||
619 | NCR_700_set_io_mapped(struct NCR_700_Host_Parameters *hostdata) | ||
620 | { | ||
621 | hostdata->mem_mapped = 0; | ||
622 | } | 495 | } |
623 | 496 | ||
624 | |||
625 | #elif defined(CONFIG_53C700_IO_MAPPED) | ||
626 | |||
627 | #define NCR_700_readb NCR_700_io_readb | ||
628 | #define NCR_700_readl NCR_700_io_readl | ||
629 | #define NCR_700_writeb NCR_700_io_writeb | ||
630 | #define NCR_700_writel NCR_700_io_writel | ||
631 | |||
632 | #define NCR_700_set_io_mapped(x) | ||
633 | #define NCR_700_set_mem_mapped(x) error I/O mapped only | ||
634 | |||
635 | #elif defined(CONFIG_53C700_MEM_MAPPED) | ||
636 | |||
637 | #define NCR_700_readb NCR_700_mem_readb | ||
638 | #define NCR_700_readl NCR_700_mem_readl | ||
639 | #define NCR_700_writeb NCR_700_mem_writeb | ||
640 | #define NCR_700_writel NCR_700_mem_writel | ||
641 | |||
642 | #define NCR_700_set_io_mapped(x) error MEM mapped only | ||
643 | #define NCR_700_set_mem_mapped(x) | ||
644 | |||
645 | #else | ||
646 | #error neither CONFIG_53C700_MEM_MAPPED nor CONFIG_53C700_IO_MAPPED is set | ||
647 | #endif | ||
648 | |||
649 | #endif | 497 | #endif |
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index d22b32f4662d..718df4c6c3b2 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig | |||
@@ -942,11 +942,6 @@ config SCSI_NCR_D700 | |||
942 | Unless you have an NCR manufactured machine, the chances are that | 942 | Unless you have an NCR manufactured machine, the chances are that |
943 | you do not have this SCSI card, so say N. | 943 | you do not have this SCSI card, so say N. |
944 | 944 | ||
945 | config 53C700_IO_MAPPED | ||
946 | bool | ||
947 | depends on SCSI_NCR_D700 | ||
948 | default y | ||
949 | |||
950 | config SCSI_LASI700 | 945 | config SCSI_LASI700 |
951 | tristate "HP Lasi SCSI support for 53c700/710" | 946 | tristate "HP Lasi SCSI support for 53c700/710" |
952 | depends on GSC && SCSI | 947 | depends on GSC && SCSI |
@@ -956,11 +951,6 @@ config SCSI_LASI700 | |||
956 | many PA-RISC workstations & servers. If you do not know whether you | 951 | many PA-RISC workstations & servers. If you do not know whether you |
957 | have a Lasi chip, it is safe to say "Y" here. | 952 | have a Lasi chip, it is safe to say "Y" here. |
958 | 953 | ||
959 | config 53C700_MEM_MAPPED | ||
960 | bool | ||
961 | depends on SCSI_LASI700 | ||
962 | default y | ||
963 | |||
964 | config 53C700_LE_ON_BE | 954 | config 53C700_LE_ON_BE |
965 | bool | 955 | bool |
966 | depends on SCSI_LASI700 | 956 | depends on SCSI_LASI700 |
diff --git a/drivers/scsi/NCR_D700.c b/drivers/scsi/NCR_D700.c index 507751941f1e..e993a7ba276f 100644 --- a/drivers/scsi/NCR_D700.c +++ b/drivers/scsi/NCR_D700.c | |||
@@ -197,12 +197,10 @@ NCR_D700_probe_one(struct NCR_D700_private *p, int siop, int irq, | |||
197 | } | 197 | } |
198 | 198 | ||
199 | /* Fill in the three required pieces of hostdata */ | 199 | /* Fill in the three required pieces of hostdata */ |
200 | hostdata->base = region; | 200 | hostdata->base = ioport_map(region, 64); |
201 | hostdata->differential = (((1<<siop) & differential) != 0); | 201 | hostdata->differential = (((1<<siop) & differential) != 0); |
202 | hostdata->clock = NCR_D700_CLOCK_MHZ; | 202 | hostdata->clock = NCR_D700_CLOCK_MHZ; |
203 | 203 | ||
204 | NCR_700_set_io_mapped(hostdata); | ||
205 | |||
206 | /* and register the siop */ | 204 | /* and register the siop */ |
207 | host = NCR_700_detect(&NCR_D700_driver_template, hostdata, p->dev); | 205 | host = NCR_700_detect(&NCR_D700_driver_template, hostdata, p->dev); |
208 | if (!host) { | 206 | if (!host) { |
@@ -214,6 +212,7 @@ NCR_D700_probe_one(struct NCR_D700_private *p, int siop, int irq, | |||
214 | /* FIXME: read this from SUS */ | 212 | /* FIXME: read this from SUS */ |
215 | host->this_id = id_array[slot * 2 + siop]; | 213 | host->this_id = id_array[slot * 2 + siop]; |
216 | host->irq = irq; | 214 | host->irq = irq; |
215 | host->base = region; | ||
217 | scsi_scan_host(host); | 216 | scsi_scan_host(host); |
218 | 217 | ||
219 | return 0; | 218 | return 0; |
diff --git a/drivers/scsi/lasi700.c b/drivers/scsi/lasi700.c index 29f250c80b98..4cbb6187cc44 100644 --- a/drivers/scsi/lasi700.c +++ b/drivers/scsi/lasi700.c | |||
@@ -131,6 +131,7 @@ lasi700_probe(struct parisc_device *dev) | |||
131 | if (!host) | 131 | if (!host) |
132 | goto out_kfree; | 132 | goto out_kfree; |
133 | host->this_id = 7; | 133 | host->this_id = 7; |
134 | host->base = base; | ||
134 | host->irq = dev->irq; | 135 | host->irq = dev->irq; |
135 | if(request_irq(dev->irq, NCR_700_intr, SA_SHIRQ, "lasi700", host)) { | 136 | if(request_irq(dev->irq, NCR_700_intr, SA_SHIRQ, "lasi700", host)) { |
136 | printk(KERN_ERR "lasi700: request_irq failed!\n"); | 137 | printk(KERN_ERR "lasi700: request_irq failed!\n"); |
diff --git a/drivers/scsi/sim710.c b/drivers/scsi/sim710.c index 63bf2aecbc57..9171788348c4 100644 --- a/drivers/scsi/sim710.c +++ b/drivers/scsi/sim710.c | |||
@@ -120,11 +120,10 @@ sim710_probe_common(struct device *dev, unsigned long base_addr, | |||
120 | } | 120 | } |
121 | 121 | ||
122 | /* Fill in the three required pieces of hostdata */ | 122 | /* Fill in the three required pieces of hostdata */ |
123 | hostdata->base = base_addr; | 123 | hostdata->base = ioport_map(base_addr, 64); |
124 | hostdata->differential = differential; | 124 | hostdata->differential = differential; |
125 | hostdata->clock = clock; | 125 | hostdata->clock = clock; |
126 | hostdata->chip710 = 1; | 126 | hostdata->chip710 = 1; |
127 | NCR_700_set_io_mapped(hostdata); | ||
128 | 127 | ||
129 | /* and register the chip */ | 128 | /* and register the chip */ |
130 | if((host = NCR_700_detect(&sim710_driver_template, hostdata, dev)) | 129 | if((host = NCR_700_detect(&sim710_driver_template, hostdata, dev)) |
@@ -133,6 +132,7 @@ sim710_probe_common(struct device *dev, unsigned long base_addr, | |||
133 | goto out_release; | 132 | goto out_release; |
134 | } | 133 | } |
135 | host->this_id = scsi_id; | 134 | host->this_id = scsi_id; |
135 | host->base = base_addr; | ||
136 | host->irq = irq; | 136 | host->irq = irq; |
137 | if (request_irq(irq, NCR_700_intr, SA_SHIRQ, "sim710", host)) { | 137 | if (request_irq(irq, NCR_700_intr, SA_SHIRQ, "sim710", host)) { |
138 | printk(KERN_ERR "sim710: request_irq failed\n"); | 138 | printk(KERN_ERR "sim710: request_irq failed\n"); |
@@ -164,6 +164,7 @@ sim710_device_remove(struct device *dev) | |||
164 | NCR_700_release(host); | 164 | NCR_700_release(host); |
165 | kfree(hostdata); | 165 | kfree(hostdata); |
166 | free_irq(host->irq, host); | 166 | free_irq(host->irq, host); |
167 | release_region(host->base, 64); | ||
167 | return 0; | 168 | return 0; |
168 | } | 169 | } |
169 | 170 | ||