]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/ieee1394/ohci1394.c
ieee1394: ohci1394: suspend/resume cosmetics
[karo-tx-linux.git] / drivers / ieee1394 / ohci1394.c
index 6e8ea9110c46cfcd92de98d01df75c1f1529ea0b..a12802553b4bae5f4caa5955b98551b6c9e0a592 100644 (file)
@@ -1225,7 +1225,7 @@ static int ohci_iso_recv_init(struct hpsb_iso *iso)
        int ctx;
        int ret = -ENOMEM;
 
-       recv = kmalloc(sizeof(*recv), SLAB_KERNEL);
+       recv = kmalloc(sizeof(*recv), GFP_KERNEL);
        if (!recv)
                return -ENOMEM;
 
@@ -1918,7 +1918,7 @@ static int ohci_iso_xmit_init(struct hpsb_iso *iso)
        int ctx;
        int ret = -ENOMEM;
 
-       xmit = kmalloc(sizeof(*xmit), SLAB_KERNEL);
+       xmit = kmalloc(sizeof(*xmit), GFP_KERNEL);
        if (!xmit)
                return -ENOMEM;
 
@@ -3021,7 +3021,7 @@ alloc_dma_rcv_ctx(struct ti_ohci *ohci, struct dma_rcv_ctx *d,
                        return -ENOMEM;
                }
 
-               d->prg_cpu[i] = pci_pool_alloc(d->prg_pool, SLAB_KERNEL, d->prg_bus+i);
+               d->prg_cpu[i] = pci_pool_alloc(d->prg_pool, GFP_KERNEL, d->prg_bus+i);
                OHCI_DMA_ALLOC("pool dma_rcv prg[%d]", i);
 
                 if (d->prg_cpu[i] != NULL) {
@@ -3117,7 +3117,7 @@ alloc_dma_trm_ctx(struct ti_ohci *ohci, struct dma_trm_ctx *d,
        OHCI_DMA_ALLOC("dma_rcv prg pool");
 
        for (i = 0; i < d->num_desc; i++) {
-               d->prg_cpu[i] = pci_pool_alloc(d->prg_pool, SLAB_KERNEL, d->prg_bus+i);
+               d->prg_cpu[i] = pci_pool_alloc(d->prg_pool, GFP_KERNEL, d->prg_bus+i);
                OHCI_DMA_ALLOC("pool dma_trm prg[%d]", i);
 
                 if (d->prg_cpu[i] != NULL) {
@@ -3529,57 +3529,91 @@ static void ohci1394_pci_remove(struct pci_dev *pdev)
 }
 
 #ifdef CONFIG_PM
-static int ohci1394_pci_resume (struct pci_dev *pdev)
+static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state)
 {
-/* PowerMac resume code comes first */
+       int err;
+       struct ti_ohci *ohci = pci_get_drvdata(pdev);
+
+       PRINT(KERN_DEBUG, "suspend called");
+       if (!ohci)
+               return -ENXIO;
+
+       /* Clear the async DMA contexts and stop using the controller */
+       hpsb_bus_reset(ohci->host);
+
+       /* See ohci1394_pci_remove() for comments on this sequence */
+       reg_write(ohci, OHCI1394_ConfigROMhdr, 0);
+       reg_write(ohci, OHCI1394_BusOptions,
+                 (reg_read(ohci, OHCI1394_BusOptions) & 0x0000f007) |
+                 0x00ff0000);
+       reg_write(ohci, OHCI1394_IntMaskClear, 0xffffffff);
+       reg_write(ohci, OHCI1394_IntEventClear, 0xffffffff);
+       reg_write(ohci, OHCI1394_IsoXmitIntMaskClear, 0xffffffff);
+       reg_write(ohci, OHCI1394_IsoXmitIntEventClear, 0xffffffff);
+       reg_write(ohci, OHCI1394_IsoRecvIntMaskClear, 0xffffffff);
+       reg_write(ohci, OHCI1394_IsoRecvIntEventClear, 0xffffffff);
+       set_phy_reg(ohci, 4, ~0xc0 & get_phy_reg(ohci, 4));
+       reg_write(ohci, OHCI1394_LinkControlClear, 0xffffffff);
+       ohci_devctl(ohci->host, RESET_BUS, LONG_RESET_NO_FORCE_ROOT);
+       ohci_soft_reset(ohci);
+
+       err = pci_save_state(pdev);
+       if (err)
+               return err;
+       err = pci_set_power_state(pdev, pci_choose_state(pdev, state));
+       if (err)
+               return err;
+
+/* PowerMac suspend code comes last */
 #ifdef CONFIG_PPC_PMAC
        if (machine_is(powermac)) {
                struct device_node *of_node;
 
-               /* Re-enable 1394 */
+               /* Disable 1394 */
                of_node = pci_device_to_OF_node (pdev);
                if (of_node)
-                       pmac_call_feature (PMAC_FTR_1394_ENABLE, of_node, 0, 1);
+                       pmac_call_feature(PMAC_FTR_1394_ENABLE, of_node, 0, 0);
        }
 #endif /* CONFIG_PPC_PMAC */
 
-       pci_set_power_state(pdev, PCI_D0);
-       pci_restore_state(pdev);
-       return pci_enable_device(pdev);
+       return 0;
 }
 
-static int ohci1394_pci_suspend (struct pci_dev *pdev, pm_message_t state)
+static int ohci1394_pci_resume(struct pci_dev *pdev)
 {
        int err;
+       struct ti_ohci *ohci = pci_get_drvdata(pdev);
 
-       printk(KERN_INFO "%s does not fully support suspend and resume yet\n",
-              OHCI1394_DRIVER_NAME);
-
-       err = pci_save_state(pdev);
-       if (err) {
-               printk(KERN_ERR "%s: pci_save_state failed with %d\n",
-                      OHCI1394_DRIVER_NAME, err);
-               return err;
-       }
-       err = pci_set_power_state(pdev, pci_choose_state(pdev, state));
-#ifdef OHCI1394_DEBUG
-       if (err)
-               printk(KERN_DEBUG "%s: pci_set_power_state failed with %d\n",
-                      OHCI1394_DRIVER_NAME, err);
-#endif /* OHCI1394_DEBUG */
+       PRINT(KERN_DEBUG, "resume called");
+       if (!ohci)
+               return -ENXIO;
 
-/* PowerMac suspend code comes last */
+/* PowerMac resume code comes first */
 #ifdef CONFIG_PPC_PMAC
        if (machine_is(powermac)) {
                struct device_node *of_node;
 
-               /* Disable 1394 */
+               /* Re-enable 1394 */
                of_node = pci_device_to_OF_node (pdev);
                if (of_node)
-                       pmac_call_feature(PMAC_FTR_1394_ENABLE, of_node, 0, 0);
+                       pmac_call_feature (PMAC_FTR_1394_ENABLE, of_node, 0, 1);
        }
 #endif /* CONFIG_PPC_PMAC */
 
+       pci_set_power_state(pdev, PCI_D0);
+       pci_restore_state(pdev);
+       err = pci_enable_device(pdev);
+       if (err)
+               return err;
+
+       /* See ohci1394_pci_probe() for comments on this sequence */
+       ohci_soft_reset(ohci);
+       reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_LPS);
+       reg_write(ohci, OHCI1394_IntEventClear, 0xffffffff);
+       reg_write(ohci, OHCI1394_IntMaskClear, 0xffffffff);
+       mdelay(50);
+       ohci_initialize(ohci);
+
        return 0;
 }
 #endif /* CONFIG_PM */