int chd_dec_pci_suspend(struct pci_dev *pdev, pm_message_t state) { struct crystalhd_adp *adp; struct device *dev = &pdev->dev; crystalhd_ioctl_data *temp; BC_STATUS sts = BC_STS_SUCCESS; adp = (struct crystalhd_adp *)pci_get_drvdata(pdev); if (!adp) { dev_err(dev, "%s: could not get adp\n", __func__); return -ENODEV; } temp = chd_dec_alloc_iodata(adp, false); if (!temp) { dev_err(dev, "could not get ioctl data\n"); return -ENODEV; } sts = crystalhd_suspend(&adp->cmds, temp); if (sts != BC_STS_SUCCESS) { dev_err(dev, "Crystal HD Suspend %d\n", sts); chd_dec_free_iodata(adp, temp, false); 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 int chd_dec_api_cmd(struct crystalhd_adp *adp, unsigned long ua, uint32_t uid, uint32_t cmd, crystalhd_cmd_proc func) { int rc; struct crystalhd_ioctl_data *temp; enum BC_STATUS sts = BC_STS_SUCCESS; temp = chd_dec_alloc_iodata(adp, 0); if (!temp) { BCMLOG_ERR("Failed to get iodata..\n"); return -EINVAL; } temp->u_id = uid; temp->cmd = cmd; rc = chd_dec_proc_user_data(adp, temp, ua, 0); if (!rc) { sts = func(&adp->cmds, temp); if (sts == BC_STS_PENDING) sts = BC_STS_NOT_IMPL; temp->udata.RetSts = sts; rc = chd_dec_proc_user_data(adp, temp, ua, 1); } if (temp) { chd_dec_free_iodata(adp, temp, 0); temp = NULL; } return rc; }
static 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 = 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 int __devinit chd_dec_init_chdev(struct crystalhd_adp *adp) { struct crystalhd_ioctl_data *temp; struct device *dev; int rc = -ENODEV, i = 0; if (!adp) goto fail; adp->chd_dec_major = register_chrdev(0, CRYSTALHD_API_NAME, &chd_dec_fops); if (adp->chd_dec_major < 0) { BCMLOG_ERR("Failed to create config dev\n"); rc = adp->chd_dec_major; goto fail; } /* register crystalhd class */ crystalhd_class = class_create(THIS_MODULE, "crystalhd"); if (IS_ERR(crystalhd_class)) { BCMLOG_ERR("failed to create class\n"); goto fail; } dev = device_create(crystalhd_class, NULL, MKDEV(adp->chd_dec_major, 0), NULL, "crystalhd"); if (IS_ERR(dev)) { BCMLOG_ERR("failed to create device\n"); goto device_create_fail; } rc = crystalhd_create_elem_pool(adp, BC_LINK_ELEM_POOL_SZ); if (rc) { BCMLOG_ERR("failed to create device\n"); goto elem_pool_fail; } /* Allocate general purpose ioctl pool. */ for (i = 0; i < CHD_IODATA_POOL_SZ; i++) { temp = kzalloc(sizeof(struct crystalhd_ioctl_data), GFP_KERNEL); if (!temp) { BCMLOG_ERR("ioctl data pool kzalloc failed\n"); rc = -ENOMEM; goto kzalloc_fail; } /* Add to global pool.. */ chd_dec_free_iodata(adp, temp, 0); } return 0; kzalloc_fail: crystalhd_delete_elem_pool(adp); elem_pool_fail: device_destroy(crystalhd_class, MKDEV(adp->chd_dec_major, 0)); device_create_fail: class_destroy(crystalhd_class); fail: return rc; }
static int chd_dec_api_cmd(struct crystalhd_adp *adp, unsigned long ua, uint32_t uid, uint32_t cmd, crystalhd_cmd_proc func) { int rc; crystalhd_ioctl_data *temp; BC_STATUS sts = BC_STS_SUCCESS; temp = chd_dec_alloc_iodata(adp, 0); if (!temp) { dev_err(chddev(), "Failed to get iodata..\n"); return -EINVAL; } temp->u_id = uid; temp->cmd = cmd; rc = chd_dec_proc_user_data(adp, temp, ua, 0); if (!rc) { if(func == NULL) sts = BC_STS_PWR_MGMT; /* Can only happen when we are in suspend state */ else sts = func(&adp->cmds, temp); if (sts == BC_STS_PENDING) sts = BC_STS_NOT_IMPL; temp->udata.RetSts = sts; rc = chd_dec_proc_user_data(adp, temp, ua, 1); } if (temp) { chd_dec_free_iodata(adp, temp, 0); temp = NULL; } return rc; }
static int __init chd_dec_init_chdev(struct crystalhd_adp *adp) { struct device *xdev = &adp->pdev->dev; struct device *dev; crystalhd_ioctl_data *temp; int rc = -ENODEV, i = 0; if (!adp) goto fail; adp->chd_dec_major = register_chrdev(0, CRYSTALHD_API_NAME, &chd_dec_fops); if (adp->chd_dec_major < 0) { dev_err(xdev, "Failed to create config dev\n"); rc = adp->chd_dec_major; goto fail; } /* register crystalhd class */ crystalhd_class = class_create(THIS_MODULE, "crystalhd"); if (IS_ERR(crystalhd_class)) { dev_err(xdev, "failed to create class\n"); goto fail; } #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 25) dev = device_create(crystalhd_class, NULL, MKDEV(adp->chd_dec_major, 0), NULL, "crystalhd"); #else dev = device_create(crystalhd_class, NULL, MKDEV(adp->chd_dec_major, 0), "crystalhd"); #endif if (IS_ERR(dev)) { dev_err(xdev, "failed to create device\n"); goto device_create_fail; } /* rc = crystalhd_create_elem_pool(adp, BC_LINK_ELEM_POOL_SZ); */ /* if (rc) { */ /* dev_err(xdev, "failed to create device\n"); */ /* goto elem_pool_fail; */ /* } */ /* Allocate general purpose ioctl pool. */ for (i = 0; i < CHD_IODATA_POOL_SZ; i++) { temp = kzalloc(sizeof(crystalhd_ioctl_data), GFP_KERNEL); if (!temp) { dev_err(xdev, "ioctl data pool kzalloc failed\n"); rc = -ENOMEM; goto kzalloc_fail; } /* Add to global pool.. */ chd_dec_free_iodata(adp, temp, 0); } return 0; kzalloc_fail: /*crystalhd_delete_elem_pool(adp); */ /*elem_pool_fail: */ device_destroy(crystalhd_class, MKDEV(adp->chd_dec_major, 0)); device_create_fail: class_destroy(crystalhd_class); fail: return rc; }