ahci: Add Marvell 6121 SATA support
authorJose Alberto Reguero <jareguero@telefonica.net>
Thu, 13 Mar 2008 22:22:24 +0000 (23:22 +0100)
committerJeff Garzik <jeff@garzik.org>
Mon, 17 Mar 2008 12:30:32 +0000 (08:30 -0400)
Signed-off-by: Jose Alberto Reguero <jareguero@telefonica.net>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/ata/ahci.c

index bbfccdbba3ab53e3ff8c034280aa5aa637b2e498..17ee6ed985d9198ad356a9b68efebf406a4b11f6 100644 (file)
@@ -591,6 +591,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
 
        /* Marvell */
        { PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv },        /* 6145 */
+       { PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv },        /* 6121 */
 
        /* Generic, PCI class code for AHCI */
        { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
@@ -665,6 +666,7 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
        void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR];
        u32 cap, port_map;
        int i;
+       int mv;
 
        /* make sure AHCI mode is enabled before accessing CAP */
        ahci_enable_ahci(mmio);
@@ -700,12 +702,16 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
         * presence register, as bit 4 (counting from 0)
         */
        if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
+               if (pdev->device == 0x6121)
+                       mv = 0x3;
+               else
+                       mv = 0xf;
                dev_printk(KERN_ERR, &pdev->dev,
                           "MV_AHCI HACK: port_map %x -> %x\n",
-                          hpriv->port_map,
-                          hpriv->port_map & 0xf);
+                          port_map,
+                          port_map & mv);
 
-               port_map &= 0xf;
+               port_map &= mv;
        }
 
        /* cross check port_map and cap.n_ports */
@@ -1172,9 +1178,14 @@ static void ahci_init_controller(struct ata_host *host)
        int i;
        void __iomem *port_mmio;
        u32 tmp;
+       int mv;
 
        if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
-               port_mmio = __ahci_port_base(host, 4);
+               if (pdev->device == 0x6121)
+                       mv = 2;
+               else
+                       mv = 4;
+               port_mmio = __ahci_port_base(host, mv);
 
                writel(0, port_mmio + PORT_IRQ_MASK);