aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/sata_sil24.c
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2007-02-17 15:09:59 -0500
committerJeff Garzik <jeff@garzik.org>2007-02-17 15:09:59 -0500
commit48c871c1f6a7c7044dd76774fb469e65c7e2e4e8 (patch)
treeda3aa535c98cc0957851354ceb0fbff7482d7a9d /drivers/ata/sata_sil24.c
parent1a1689344add3333d28d1b5495d8043a3877d01c (diff)
parent4409d28140d9a6e6e3f4f1fdaf7234c4b965d954 (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.c178
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
63enum { 62enum {
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 */
325struct 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
330static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev); 326static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev);
331static u8 sil24_check_status(struct ata_port *ap); 327static u8 sil24_check_status(struct ata_port *ap);
332static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg); 328static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg);
@@ -341,8 +337,6 @@ static void sil24_thaw(struct ata_port *ap);
341static void sil24_error_handler(struct ata_port *ap); 337static void sil24_error_handler(struct ata_port *ap);
342static void sil24_post_internal_cmd(struct ata_queued_cmd *qc); 338static void sil24_post_internal_cmd(struct ata_queued_cmd *qc);
343static int sil24_port_start(struct ata_port *ap); 339static int sil24_port_start(struct ata_port *ap);
344static void sil24_port_stop(struct ata_port *ap);
345static void sil24_host_stop(struct ata_host *host);
346static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); 340static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
347#ifdef CONFIG_PM 341#ifdef CONFIG_PM
348static int sil24_pci_device_resume(struct pci_dev *pdev); 342static 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
468static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev) 462static 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)
478static inline void sil24_update_tf(struct ata_port *ap) 472static 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
502static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg) 496static 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
513static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val) 507static 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
529static int sil24_init_port(struct ata_port *ap) 523static 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
545static int sil24_softreset(struct ata_port *ap, unsigned int *class) 539static 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
605static int sil24_hardreset(struct ata_port *ap, unsigned int *class) 599static 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
743static void sil24_freeze(struct ata_port *ap) 737static 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
753static void sil24_thaw(struct ata_port *ap) 747static 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
766static void sil24_error_intr(struct ata_port *ap) 760static 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
844static inline void sil24_host_intr(struct ata_port *ap) 838static 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)
878static irqreturn_t sil24_interrupt(int irq, void *dev_instance) 872static 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
941static 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
948static int sil24_port_start(struct ata_port *ap) 935static 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
979err_out_pad:
980 sil24_cblk_free(pp, dev);
981err_out_pp:
982 kfree(pp);
983err_out:
984 return rc;
985}
986
987static 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
997static 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
1007static void sil24_init_controller(struct pci_dev *pdev, int n_ports, 967static 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,
1066static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 1026static 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
1199static int sil24_pci_device_resume(struct pci_dev *pdev) 1135static 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