int chd_dec_pci_suspend(struct pci_dev *pdev, pm_message_t state) { struct crystalhd_adp *adp; struct crystalhd_ioctl_data *temp; enum BC_STATUS sts = BC_STS_SUCCESS; adp = (struct crystalhd_adp *)pci_get_drvdata(pdev); if (!adp) { BCMLOG_ERR("could not get adp\n"); return -ENODEV; } temp = chd_dec_alloc_iodata(adp, false); if (!temp) { BCMLOG_ERR("could not get ioctl data\n"); return -ENODEV; } sts = crystalhd_suspend(&adp->cmds, temp); if (sts != BC_STS_SUCCESS) { BCMLOG_ERR("BCM70012 Suspend %d\n", sts); return -ENODEV; } chd_dec_free_iodata(adp, temp, false); chd_dec_disable_int(adp); pci_save_state(pdev); /* Disable IO/bus master/irq router */ pci_disable_device(pdev); pci_set_power_state(pdev, pci_choose_state(pdev, state)); return 0; }
static void __devexit chd_dec_pci_remove(struct pci_dev *pdev) { struct crystalhd_adp *pinfo; enum BC_STATUS sts = BC_STS_SUCCESS; BCMLOG_ENTER; pinfo = (struct crystalhd_adp *) pci_get_drvdata(pdev); if (!pinfo) { BCMLOG_ERR("could not get adp\n"); return; } sts = crystalhd_delete_cmd_context(&pinfo->cmds); if (sts != BC_STS_SUCCESS) BCMLOG_ERR("cmd delete :%d\n", sts); chd_dec_release_chdev(pinfo); chd_dec_disable_int(pinfo); chd_pci_release_mem(pinfo); pci_disable_device(pinfo->pdev); kfree(pinfo); g_adp_info = NULL; }
static void __exit chd_dec_pci_remove(struct pci_dev *pdev) { struct crystalhd_adp *pinfo; BC_STATUS sts = BC_STS_SUCCESS; dev_dbg(chddev(), "Entering %s\n", __func__); pinfo = (struct crystalhd_adp *) pci_get_drvdata(pdev); if (!pinfo) { dev_err(chddev(), "could not get adp\n"); return; } sts = crystalhd_delete_cmd_context(&pinfo->cmds); if (sts != BC_STS_SUCCESS) dev_err(chddev(), "cmd delete :%d\n", sts); chd_dec_release_chdev(pinfo); chd_dec_disable_int(pinfo); chd_pci_release_mem(pinfo); pci_disable_device(pinfo->pdev); kfree(pinfo); g_adp_info = NULL; }
static int __init chd_dec_pci_probe(struct pci_dev *pdev, const struct pci_device_id *entry) { struct device *dev = &pdev->dev; struct crystalhd_adp *pinfo; int rc; BC_STATUS sts = BC_STS_SUCCESS; dev_info(dev, "Starting Device:0x%04x\n", pdev->device); pinfo = kzalloc(sizeof(struct crystalhd_adp), GFP_KERNEL); if (!pinfo) { dev_err(dev, "%s: Failed to allocate memory\n", __func__); rc = -ENOMEM; goto out; } pinfo->pdev = pdev; rc = pci_enable_device(pdev); if (rc) { dev_err(dev, "%s: Failed to enable PCI device\n", __func__); goto free_priv; } snprintf(pinfo->name, sizeof(pinfo->name), "crystalhd_pci_e:%d:%d:%d", pdev->bus->number, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn)); rc = chd_pci_reserve_mem(pinfo); if (rc) { dev_err(dev, "%s: Failed to set up memory regions.\n", __func__); goto disable_device; } pinfo->present = 1; pinfo->drv_data = entry->driver_data; /* Setup adapter level lock.. */ spin_lock_init(&pinfo->lock); /* setup api stuff.. */ rc = chd_dec_init_chdev(pinfo); if (rc) goto release_mem; rc = chd_dec_enable_int(pinfo); if (rc) { dev_err(dev, "%s: _enable_int err:%d\n", __func__, rc); goto cleanup_chdev; } /* Set dma mask... */ if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) { pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); pinfo->dmabits = 64; } else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) { pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); pinfo->dmabits = 32; } else { dev_err(dev, "%s: Unabled to setup DMA %d\n", __func__, rc); rc = -ENODEV; goto cleanup_int; } sts = crystalhd_setup_cmd_context(&pinfo->cmds, pinfo); if (sts != BC_STS_SUCCESS) { dev_err(dev, "%s: cmd setup :%d\n", __func__, sts); rc = -ENODEV; goto cleanup_int; } pci_set_master(pdev); pci_set_drvdata(pdev, pinfo); g_adp_info = pinfo; out: return rc; cleanup_int: chd_dec_disable_int(pinfo); cleanup_chdev: chd_dec_release_chdev(pinfo); release_mem: chd_pci_release_mem(pinfo); disable_device: pci_disable_device(pdev); free_priv: kfree(pdev); goto out; }