diff options
author | Jeff Garzik <jeff@garzik.org> | 2007-02-17 15:09:59 -0500 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-02-17 15:09:59 -0500 |
commit | 48c871c1f6a7c7044dd76774fb469e65c7e2e4e8 (patch) | |
tree | da3aa535c98cc0957851354ceb0fbff7482d7a9d /drivers/ata/sata_sil24.c | |
parent | 1a1689344add3333d28d1b5495d8043a3877d01c (diff) | |
parent | 4409d28140d9a6e6e3f4f1fdaf7234c4b965d954 (diff) |
Merge branch 'gfar' of master.kernel.org:/pub/scm/linux/kernel/git/galak/powerpc into upstream
Diffstat (limited to 'drivers/ata/sata_sil24.c')
-rw-r--r-- | drivers/ata/sata_sil24.c | 178 |
1 files changed, 59 insertions, 119 deletions
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index 5aa288d2fb86..e65e8d55da3e 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
@@ -28,7 +28,6 @@ | |||
28 | #include <scsi/scsi_host.h> | 28 | #include <scsi/scsi_host.h> |
29 | #include <scsi/scsi_cmnd.h> | 29 | #include <scsi/scsi_cmnd.h> |
30 | #include <linux/libata.h> | 30 | #include <linux/libata.h> |
31 | #include <asm/io.h> | ||
32 | 31 | ||
33 | #define DRV_NAME "sata_sil24" | 32 | #define DRV_NAME "sata_sil24" |
34 | #define DRV_VERSION "0.3" | 33 | #define DRV_VERSION "0.3" |
@@ -61,6 +60,9 @@ struct sil24_port_multiplier { | |||
61 | }; | 60 | }; |
62 | 61 | ||
63 | enum { | 62 | enum { |
63 | SIL24_HOST_BAR = 0, | ||
64 | SIL24_PORT_BAR = 2, | ||
65 | |||
64 | /* | 66 | /* |
65 | * Global controller registers (128 bytes @ BAR0) | 67 | * Global controller registers (128 bytes @ BAR0) |
66 | */ | 68 | */ |
@@ -321,12 +323,6 @@ struct sil24_port_priv { | |||
321 | struct ata_taskfile tf; /* Cached taskfile registers */ | 323 | struct ata_taskfile tf; /* Cached taskfile registers */ |
322 | }; | 324 | }; |
323 | 325 | ||
324 | /* ap->host->private_data */ | ||
325 | struct sil24_host_priv { | ||
326 | void __iomem *host_base; /* global controller control (128 bytes @BAR0) */ | ||
327 | void __iomem *port_base; /* port registers (4 * 8192 bytes @BAR2) */ | ||
328 | }; | ||
329 | |||
330 | static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev); | 326 | static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev); |
331 | static u8 sil24_check_status(struct ata_port *ap); | 327 | static u8 sil24_check_status(struct ata_port *ap); |
332 | static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg); | 328 | static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg); |
@@ -341,8 +337,6 @@ static void sil24_thaw(struct ata_port *ap); | |||
341 | static void sil24_error_handler(struct ata_port *ap); | 337 | static void sil24_error_handler(struct ata_port *ap); |
342 | static void sil24_post_internal_cmd(struct ata_queued_cmd *qc); | 338 | static void sil24_post_internal_cmd(struct ata_queued_cmd *qc); |
343 | static int sil24_port_start(struct ata_port *ap); | 339 | static int sil24_port_start(struct ata_port *ap); |
344 | static void sil24_port_stop(struct ata_port *ap); | ||
345 | static void sil24_host_stop(struct ata_host *host); | ||
346 | static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 340 | static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); |
347 | #ifdef CONFIG_PM | 341 | #ifdef CONFIG_PM |
348 | static int sil24_pci_device_resume(struct pci_dev *pdev); | 342 | static int sil24_pci_device_resume(struct pci_dev *pdev); |
@@ -362,7 +356,7 @@ static struct pci_driver sil24_pci_driver = { | |||
362 | .name = DRV_NAME, | 356 | .name = DRV_NAME, |
363 | .id_table = sil24_pci_tbl, | 357 | .id_table = sil24_pci_tbl, |
364 | .probe = sil24_init_one, | 358 | .probe = sil24_init_one, |
365 | .remove = ata_pci_remove_one, /* safe? */ | 359 | .remove = ata_pci_remove_one, |
366 | #ifdef CONFIG_PM | 360 | #ifdef CONFIG_PM |
367 | .suspend = ata_pci_device_suspend, | 361 | .suspend = ata_pci_device_suspend, |
368 | .resume = sil24_pci_device_resume, | 362 | .resume = sil24_pci_device_resume, |
@@ -406,6 +400,8 @@ static const struct ata_port_operations sil24_ops = { | |||
406 | 400 | ||
407 | .irq_handler = sil24_interrupt, | 401 | .irq_handler = sil24_interrupt, |
408 | .irq_clear = sil24_irq_clear, | 402 | .irq_clear = sil24_irq_clear, |
403 | .irq_on = ata_dummy_irq_on, | ||
404 | .irq_ack = ata_dummy_irq_ack, | ||
409 | 405 | ||
410 | .scr_read = sil24_scr_read, | 406 | .scr_read = sil24_scr_read, |
411 | .scr_write = sil24_scr_write, | 407 | .scr_write = sil24_scr_write, |
@@ -416,8 +412,6 @@ static const struct ata_port_operations sil24_ops = { | |||
416 | .post_internal_cmd = sil24_post_internal_cmd, | 412 | .post_internal_cmd = sil24_post_internal_cmd, |
417 | 413 | ||
418 | .port_start = sil24_port_start, | 414 | .port_start = sil24_port_start, |
419 | .port_stop = sil24_port_stop, | ||
420 | .host_stop = sil24_host_stop, | ||
421 | }; | 415 | }; |
422 | 416 | ||
423 | /* | 417 | /* |
@@ -467,7 +461,7 @@ static int sil24_tag(int tag) | |||
467 | 461 | ||
468 | static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev) | 462 | static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev) |
469 | { | 463 | { |
470 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; | 464 | void __iomem *port = ap->ioaddr.cmd_addr; |
471 | 465 | ||
472 | if (dev->cdb_len == 16) | 466 | if (dev->cdb_len == 16) |
473 | writel(PORT_CS_CDB16, port + PORT_CTRL_STAT); | 467 | writel(PORT_CS_CDB16, port + PORT_CTRL_STAT); |
@@ -478,7 +472,7 @@ static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev) | |||
478 | static inline void sil24_update_tf(struct ata_port *ap) | 472 | static inline void sil24_update_tf(struct ata_port *ap) |
479 | { | 473 | { |
480 | struct sil24_port_priv *pp = ap->private_data; | 474 | struct sil24_port_priv *pp = ap->private_data; |
481 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; | 475 | void __iomem *port = ap->ioaddr.cmd_addr; |
482 | struct sil24_prb __iomem *prb = port; | 476 | struct sil24_prb __iomem *prb = port; |
483 | u8 fis[6 * 4]; | 477 | u8 fis[6 * 4]; |
484 | 478 | ||
@@ -501,7 +495,7 @@ static int sil24_scr_map[] = { | |||
501 | 495 | ||
502 | static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg) | 496 | static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg) |
503 | { | 497 | { |
504 | void __iomem *scr_addr = (void __iomem *)ap->ioaddr.scr_addr; | 498 | void __iomem *scr_addr = ap->ioaddr.scr_addr; |
505 | if (sc_reg < ARRAY_SIZE(sil24_scr_map)) { | 499 | if (sc_reg < ARRAY_SIZE(sil24_scr_map)) { |
506 | void __iomem *addr; | 500 | void __iomem *addr; |
507 | addr = scr_addr + sil24_scr_map[sc_reg] * 4; | 501 | addr = scr_addr + sil24_scr_map[sc_reg] * 4; |
@@ -512,7 +506,7 @@ static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg) | |||
512 | 506 | ||
513 | static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val) | 507 | static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val) |
514 | { | 508 | { |
515 | void __iomem *scr_addr = (void __iomem *)ap->ioaddr.scr_addr; | 509 | void __iomem *scr_addr = ap->ioaddr.scr_addr; |
516 | if (sc_reg < ARRAY_SIZE(sil24_scr_map)) { | 510 | if (sc_reg < ARRAY_SIZE(sil24_scr_map)) { |
517 | void __iomem *addr; | 511 | void __iomem *addr; |
518 | addr = scr_addr + sil24_scr_map[sc_reg] * 4; | 512 | addr = scr_addr + sil24_scr_map[sc_reg] * 4; |
@@ -528,7 +522,7 @@ static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf) | |||
528 | 522 | ||
529 | static int sil24_init_port(struct ata_port *ap) | 523 | static int sil24_init_port(struct ata_port *ap) |
530 | { | 524 | { |
531 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; | 525 | void __iomem *port = ap->ioaddr.cmd_addr; |
532 | u32 tmp; | 526 | u32 tmp; |
533 | 527 | ||
534 | writel(PORT_CS_INIT, port + PORT_CTRL_STAT); | 528 | writel(PORT_CS_INIT, port + PORT_CTRL_STAT); |
@@ -544,7 +538,7 @@ static int sil24_init_port(struct ata_port *ap) | |||
544 | 538 | ||
545 | static int sil24_softreset(struct ata_port *ap, unsigned int *class) | 539 | static int sil24_softreset(struct ata_port *ap, unsigned int *class) |
546 | { | 540 | { |
547 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; | 541 | void __iomem *port = ap->ioaddr.cmd_addr; |
548 | struct sil24_port_priv *pp = ap->private_data; | 542 | struct sil24_port_priv *pp = ap->private_data; |
549 | struct sil24_prb *prb = &pp->cmd_block[0].ata.prb; | 543 | struct sil24_prb *prb = &pp->cmd_block[0].ata.prb; |
550 | dma_addr_t paddr = pp->cmd_block_dma; | 544 | dma_addr_t paddr = pp->cmd_block_dma; |
@@ -604,7 +598,7 @@ static int sil24_softreset(struct ata_port *ap, unsigned int *class) | |||
604 | 598 | ||
605 | static int sil24_hardreset(struct ata_port *ap, unsigned int *class) | 599 | static int sil24_hardreset(struct ata_port *ap, unsigned int *class) |
606 | { | 600 | { |
607 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; | 601 | void __iomem *port = ap->ioaddr.cmd_addr; |
608 | const char *reason; | 602 | const char *reason; |
609 | int tout_msec, rc; | 603 | int tout_msec, rc; |
610 | u32 tmp; | 604 | u32 tmp; |
@@ -721,7 +715,7 @@ static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc) | |||
721 | { | 715 | { |
722 | struct ata_port *ap = qc->ap; | 716 | struct ata_port *ap = qc->ap; |
723 | struct sil24_port_priv *pp = ap->private_data; | 717 | struct sil24_port_priv *pp = ap->private_data; |
724 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; | 718 | void __iomem *port = ap->ioaddr.cmd_addr; |
725 | unsigned int tag = sil24_tag(qc->tag); | 719 | unsigned int tag = sil24_tag(qc->tag); |
726 | dma_addr_t paddr; | 720 | dma_addr_t paddr; |
727 | void __iomem *activate; | 721 | void __iomem *activate; |
@@ -742,7 +736,7 @@ static void sil24_irq_clear(struct ata_port *ap) | |||
742 | 736 | ||
743 | static void sil24_freeze(struct ata_port *ap) | 737 | static void sil24_freeze(struct ata_port *ap) |
744 | { | 738 | { |
745 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; | 739 | void __iomem *port = ap->ioaddr.cmd_addr; |
746 | 740 | ||
747 | /* Port-wide IRQ mask in HOST_CTRL doesn't really work, clear | 741 | /* Port-wide IRQ mask in HOST_CTRL doesn't really work, clear |
748 | * PORT_IRQ_ENABLE instead. | 742 | * PORT_IRQ_ENABLE instead. |
@@ -752,7 +746,7 @@ static void sil24_freeze(struct ata_port *ap) | |||
752 | 746 | ||
753 | static void sil24_thaw(struct ata_port *ap) | 747 | static void sil24_thaw(struct ata_port *ap) |
754 | { | 748 | { |
755 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; | 749 | void __iomem *port = ap->ioaddr.cmd_addr; |
756 | u32 tmp; | 750 | u32 tmp; |
757 | 751 | ||
758 | /* clear IRQ */ | 752 | /* clear IRQ */ |
@@ -765,7 +759,7 @@ static void sil24_thaw(struct ata_port *ap) | |||
765 | 759 | ||
766 | static void sil24_error_intr(struct ata_port *ap) | 760 | static void sil24_error_intr(struct ata_port *ap) |
767 | { | 761 | { |
768 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; | 762 | void __iomem *port = ap->ioaddr.cmd_addr; |
769 | struct ata_eh_info *ehi = &ap->eh_info; | 763 | struct ata_eh_info *ehi = &ap->eh_info; |
770 | int freeze = 0; | 764 | int freeze = 0; |
771 | u32 irq_stat; | 765 | u32 irq_stat; |
@@ -843,7 +837,7 @@ static void sil24_finish_qc(struct ata_queued_cmd *qc) | |||
843 | 837 | ||
844 | static inline void sil24_host_intr(struct ata_port *ap) | 838 | static inline void sil24_host_intr(struct ata_port *ap) |
845 | { | 839 | { |
846 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; | 840 | void __iomem *port = ap->ioaddr.cmd_addr; |
847 | u32 slot_stat, qc_active; | 841 | u32 slot_stat, qc_active; |
848 | int rc; | 842 | int rc; |
849 | 843 | ||
@@ -878,12 +872,12 @@ static inline void sil24_host_intr(struct ata_port *ap) | |||
878 | static irqreturn_t sil24_interrupt(int irq, void *dev_instance) | 872 | static irqreturn_t sil24_interrupt(int irq, void *dev_instance) |
879 | { | 873 | { |
880 | struct ata_host *host = dev_instance; | 874 | struct ata_host *host = dev_instance; |
881 | struct sil24_host_priv *hpriv = host->private_data; | 875 | void __iomem *host_base = host->iomap[SIL24_HOST_BAR]; |
882 | unsigned handled = 0; | 876 | unsigned handled = 0; |
883 | u32 status; | 877 | u32 status; |
884 | int i; | 878 | int i; |
885 | 879 | ||
886 | status = readl(hpriv->host_base + HOST_IRQ_STAT); | 880 | status = readl(host_base + HOST_IRQ_STAT); |
887 | 881 | ||
888 | if (status == 0xffffffff) { | 882 | if (status == 0xffffffff) { |
889 | printk(KERN_ERR DRV_NAME ": IRQ status == 0xffffffff, " | 883 | printk(KERN_ERR DRV_NAME ": IRQ status == 0xffffffff, " |
@@ -938,13 +932,6 @@ static void sil24_post_internal_cmd(struct ata_queued_cmd *qc) | |||
938 | sil24_init_port(ap); | 932 | sil24_init_port(ap); |
939 | } | 933 | } |
940 | 934 | ||
941 | static inline void sil24_cblk_free(struct sil24_port_priv *pp, struct device *dev) | ||
942 | { | ||
943 | const size_t cb_size = sizeof(*pp->cmd_block) * SIL24_MAX_CMDS; | ||
944 | |||
945 | dma_free_coherent(dev, cb_size, pp->cmd_block, pp->cmd_block_dma); | ||
946 | } | ||
947 | |||
948 | static int sil24_port_start(struct ata_port *ap) | 935 | static int sil24_port_start(struct ata_port *ap) |
949 | { | 936 | { |
950 | struct device *dev = ap->host->dev; | 937 | struct device *dev = ap->host->dev; |
@@ -952,22 +939,22 @@ static int sil24_port_start(struct ata_port *ap) | |||
952 | union sil24_cmd_block *cb; | 939 | union sil24_cmd_block *cb; |
953 | size_t cb_size = sizeof(*cb) * SIL24_MAX_CMDS; | 940 | size_t cb_size = sizeof(*cb) * SIL24_MAX_CMDS; |
954 | dma_addr_t cb_dma; | 941 | dma_addr_t cb_dma; |
955 | int rc = -ENOMEM; | 942 | int rc; |
956 | 943 | ||
957 | pp = kzalloc(sizeof(*pp), GFP_KERNEL); | 944 | pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL); |
958 | if (!pp) | 945 | if (!pp) |
959 | goto err_out; | 946 | return -ENOMEM; |
960 | 947 | ||
961 | pp->tf.command = ATA_DRDY; | 948 | pp->tf.command = ATA_DRDY; |
962 | 949 | ||
963 | cb = dma_alloc_coherent(dev, cb_size, &cb_dma, GFP_KERNEL); | 950 | cb = dmam_alloc_coherent(dev, cb_size, &cb_dma, GFP_KERNEL); |
964 | if (!cb) | 951 | if (!cb) |
965 | goto err_out_pp; | 952 | return -ENOMEM; |
966 | memset(cb, 0, cb_size); | 953 | memset(cb, 0, cb_size); |
967 | 954 | ||
968 | rc = ata_pad_alloc(ap, dev); | 955 | rc = ata_pad_alloc(ap, dev); |
969 | if (rc) | 956 | if (rc) |
970 | goto err_out_pad; | 957 | return rc; |
971 | 958 | ||
972 | pp->cmd_block = cb; | 959 | pp->cmd_block = cb; |
973 | pp->cmd_block_dma = cb_dma; | 960 | pp->cmd_block_dma = cb_dma; |
@@ -975,33 +962,6 @@ static int sil24_port_start(struct ata_port *ap) | |||
975 | ap->private_data = pp; | 962 | ap->private_data = pp; |
976 | 963 | ||
977 | return 0; | 964 | return 0; |
978 | |||
979 | err_out_pad: | ||
980 | sil24_cblk_free(pp, dev); | ||
981 | err_out_pp: | ||
982 | kfree(pp); | ||
983 | err_out: | ||
984 | return rc; | ||
985 | } | ||
986 | |||
987 | static void sil24_port_stop(struct ata_port *ap) | ||
988 | { | ||
989 | struct device *dev = ap->host->dev; | ||
990 | struct sil24_port_priv *pp = ap->private_data; | ||
991 | |||
992 | sil24_cblk_free(pp, dev); | ||
993 | ata_pad_free(ap, dev); | ||
994 | kfree(pp); | ||
995 | } | ||
996 | |||
997 | static void sil24_host_stop(struct ata_host *host) | ||
998 | { | ||
999 | struct sil24_host_priv *hpriv = host->private_data; | ||
1000 | struct pci_dev *pdev = to_pci_dev(host->dev); | ||
1001 | |||
1002 | pci_iounmap(pdev, hpriv->host_base); | ||
1003 | pci_iounmap(pdev, hpriv->port_base); | ||
1004 | kfree(hpriv); | ||
1005 | } | 965 | } |
1006 | 966 | ||
1007 | static void sil24_init_controller(struct pci_dev *pdev, int n_ports, | 967 | static void sil24_init_controller(struct pci_dev *pdev, int n_ports, |
@@ -1066,43 +1026,32 @@ static void sil24_init_controller(struct pci_dev *pdev, int n_ports, | |||
1066 | static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | 1026 | static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
1067 | { | 1027 | { |
1068 | static int printed_version = 0; | 1028 | static int printed_version = 0; |
1029 | struct device *dev = &pdev->dev; | ||
1069 | unsigned int board_id = (unsigned int)ent->driver_data; | 1030 | unsigned int board_id = (unsigned int)ent->driver_data; |
1070 | struct ata_port_info *pinfo = &sil24_port_info[board_id]; | 1031 | struct ata_port_info *pinfo = &sil24_port_info[board_id]; |
1071 | struct ata_probe_ent *probe_ent = NULL; | 1032 | struct ata_probe_ent *probe_ent; |
1072 | struct sil24_host_priv *hpriv = NULL; | 1033 | void __iomem *host_base; |
1073 | void __iomem *host_base = NULL; | 1034 | void __iomem *port_base; |
1074 | void __iomem *port_base = NULL; | ||
1075 | int i, rc; | 1035 | int i, rc; |
1076 | u32 tmp; | 1036 | u32 tmp; |
1077 | 1037 | ||
1078 | if (!printed_version++) | 1038 | if (!printed_version++) |
1079 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); | 1039 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); |
1080 | 1040 | ||
1081 | rc = pci_enable_device(pdev); | 1041 | rc = pcim_enable_device(pdev); |
1082 | if (rc) | 1042 | if (rc) |
1083 | return rc; | 1043 | return rc; |
1084 | 1044 | ||
1085 | rc = pci_request_regions(pdev, DRV_NAME); | 1045 | rc = pcim_iomap_regions(pdev, |
1046 | (1 << SIL24_HOST_BAR) | (1 << SIL24_PORT_BAR), | ||
1047 | DRV_NAME); | ||
1086 | if (rc) | 1048 | if (rc) |
1087 | goto out_disable; | 1049 | return rc; |
1088 | |||
1089 | rc = -ENOMEM; | ||
1090 | /* map mmio registers */ | ||
1091 | host_base = pci_iomap(pdev, 0, 0); | ||
1092 | if (!host_base) | ||
1093 | goto out_free; | ||
1094 | port_base = pci_iomap(pdev, 2, 0); | ||
1095 | if (!port_base) | ||
1096 | goto out_free; | ||
1097 | |||
1098 | /* allocate & init probe_ent and hpriv */ | ||
1099 | probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL); | ||
1100 | if (!probe_ent) | ||
1101 | goto out_free; | ||
1102 | 1050 | ||
1103 | hpriv = kzalloc(sizeof(*hpriv), GFP_KERNEL); | 1051 | /* allocate & init probe_ent */ |
1104 | if (!hpriv) | 1052 | probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL); |
1105 | goto out_free; | 1053 | if (!probe_ent) |
1054 | return -ENOMEM; | ||
1106 | 1055 | ||
1107 | probe_ent->dev = pci_dev_to_dev(pdev); | 1056 | probe_ent->dev = pci_dev_to_dev(pdev); |
1108 | INIT_LIST_HEAD(&probe_ent->node); | 1057 | INIT_LIST_HEAD(&probe_ent->node); |
@@ -1117,10 +1066,10 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1117 | 1066 | ||
1118 | probe_ent->irq = pdev->irq; | 1067 | probe_ent->irq = pdev->irq; |
1119 | probe_ent->irq_flags = IRQF_SHARED; | 1068 | probe_ent->irq_flags = IRQF_SHARED; |
1120 | probe_ent->private_data = hpriv; | 1069 | probe_ent->iomap = pcim_iomap_table(pdev); |
1121 | 1070 | ||
1122 | hpriv->host_base = host_base; | 1071 | host_base = probe_ent->iomap[SIL24_HOST_BAR]; |
1123 | hpriv->port_base = port_base; | 1072 | port_base = probe_ent->iomap[SIL24_PORT_BAR]; |
1124 | 1073 | ||
1125 | /* | 1074 | /* |
1126 | * Configure the device | 1075 | * Configure the device |
@@ -1132,7 +1081,7 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1132 | if (rc) { | 1081 | if (rc) { |
1133 | dev_printk(KERN_ERR, &pdev->dev, | 1082 | dev_printk(KERN_ERR, &pdev->dev, |
1134 | "64-bit DMA enable failed\n"); | 1083 | "64-bit DMA enable failed\n"); |
1135 | goto out_free; | 1084 | return rc; |
1136 | } | 1085 | } |
1137 | } | 1086 | } |
1138 | } else { | 1087 | } else { |
@@ -1140,13 +1089,13 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1140 | if (rc) { | 1089 | if (rc) { |
1141 | dev_printk(KERN_ERR, &pdev->dev, | 1090 | dev_printk(KERN_ERR, &pdev->dev, |
1142 | "32-bit DMA enable failed\n"); | 1091 | "32-bit DMA enable failed\n"); |
1143 | goto out_free; | 1092 | return rc; |
1144 | } | 1093 | } |
1145 | rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); | 1094 | rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); |
1146 | if (rc) { | 1095 | if (rc) { |
1147 | dev_printk(KERN_ERR, &pdev->dev, | 1096 | dev_printk(KERN_ERR, &pdev->dev, |
1148 | "32-bit consistent DMA enable failed\n"); | 1097 | "32-bit consistent DMA enable failed\n"); |
1149 | goto out_free; | 1098 | return rc; |
1150 | } | 1099 | } |
1151 | } | 1100 | } |
1152 | 1101 | ||
@@ -1162,11 +1111,10 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1162 | } | 1111 | } |
1163 | 1112 | ||
1164 | for (i = 0; i < probe_ent->n_ports; i++) { | 1113 | for (i = 0; i < probe_ent->n_ports; i++) { |
1165 | unsigned long portu = | 1114 | void __iomem *port = port_base + i * PORT_REGS_SIZE; |
1166 | (unsigned long)port_base + i * PORT_REGS_SIZE; | ||
1167 | 1115 | ||
1168 | probe_ent->port[i].cmd_addr = portu; | 1116 | probe_ent->port[i].cmd_addr = port; |
1169 | probe_ent->port[i].scr_addr = portu + PORT_SCONTROL; | 1117 | probe_ent->port[i].scr_addr = port + PORT_SCONTROL; |
1170 | 1118 | ||
1171 | ata_std_ports(&probe_ent->port[i]); | 1119 | ata_std_ports(&probe_ent->port[i]); |
1172 | } | 1120 | } |
@@ -1176,38 +1124,30 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1176 | 1124 | ||
1177 | pci_set_master(pdev); | 1125 | pci_set_master(pdev); |
1178 | 1126 | ||
1179 | /* FIXME: check ata_device_add return value */ | 1127 | if (!ata_device_add(probe_ent)) |
1180 | ata_device_add(probe_ent); | 1128 | return -ENODEV; |
1181 | 1129 | ||
1182 | kfree(probe_ent); | 1130 | devm_kfree(dev, probe_ent); |
1183 | return 0; | 1131 | return 0; |
1184 | |||
1185 | out_free: | ||
1186 | if (host_base) | ||
1187 | pci_iounmap(pdev, host_base); | ||
1188 | if (port_base) | ||
1189 | pci_iounmap(pdev, port_base); | ||
1190 | kfree(probe_ent); | ||
1191 | kfree(hpriv); | ||
1192 | pci_release_regions(pdev); | ||
1193 | out_disable: | ||
1194 | pci_disable_device(pdev); | ||
1195 | return rc; | ||
1196 | } | 1132 | } |
1197 | 1133 | ||
1198 | #ifdef CONFIG_PM | 1134 | #ifdef CONFIG_PM |
1199 | static int sil24_pci_device_resume(struct pci_dev *pdev) | 1135 | static int sil24_pci_device_resume(struct pci_dev *pdev) |
1200 | { | 1136 | { |
1201 | struct ata_host *host = dev_get_drvdata(&pdev->dev); | 1137 | struct ata_host *host = dev_get_drvdata(&pdev->dev); |
1202 | struct sil24_host_priv *hpriv = host->private_data; | 1138 | void __iomem *host_base = host->iomap[SIL24_HOST_BAR]; |
1139 | void __iomem *port_base = host->iomap[SIL24_PORT_BAR]; | ||
1140 | int rc; | ||
1203 | 1141 | ||
1204 | ata_pci_device_do_resume(pdev); | 1142 | rc = ata_pci_device_do_resume(pdev); |
1143 | if (rc) | ||
1144 | return rc; | ||
1205 | 1145 | ||
1206 | if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) | 1146 | if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) |
1207 | writel(HOST_CTRL_GLOBAL_RST, hpriv->host_base + HOST_CTRL); | 1147 | writel(HOST_CTRL_GLOBAL_RST, host_base + HOST_CTRL); |
1208 | 1148 | ||
1209 | sil24_init_controller(pdev, host->n_ports, host->ports[0]->flags, | 1149 | sil24_init_controller(pdev, host->n_ports, host->ports[0]->flags, |
1210 | hpriv->host_base, hpriv->port_base); | 1150 | host_base, port_base); |
1211 | 1151 | ||
1212 | ata_host_resume(host); | 1152 | ata_host_resume(host); |
1213 | 1153 | ||