static int hva_remove(struct platform_device *pdev) { struct hva_dev *hva = platform_get_drvdata(pdev); struct device *dev = hva_to_dev(hva); hva_unregister_device(hva); destroy_workqueue(hva->work_queue); hva_hw_remove(hva); v4l2_device_unregister(&hva->v4l2_dev); dev_info(dev, "%s %s removed\n", HVA_PREFIX, pdev->name); return 0; }
static int hva_remove(struct platform_device *pdev) { struct hva_dev *hva = platform_get_drvdata(pdev); struct device *dev = hva_to_dev(hva); hva_unregister_device(hva); destroy_workqueue(hva->work_queue); hva_hw_remove(hva); #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS hva_debugfs_remove(hva); #endif v4l2_device_unregister(&hva->v4l2_dev); dev_info(dev, "%s %s removed\n", HVA_PREFIX, pdev->name); return 0; }
static int hva_probe(struct platform_device *pdev) { struct hva_dev *hva; struct device *dev = &pdev->dev; int ret; hva = devm_kzalloc(dev, sizeof(*hva), GFP_KERNEL); if (!hva) { ret = -ENOMEM; goto err; } hva->dev = dev; hva->pdev = pdev; platform_set_drvdata(pdev, hva); mutex_init(&hva->lock); /* probe hardware */ ret = hva_hw_probe(pdev, hva); if (ret) goto err; /* register all available encoders */ register_encoders(hva); /* register all supported formats */ register_formats(hva); /* register on V4L2 */ ret = v4l2_device_register(dev, &hva->v4l2_dev); if (ret) { dev_err(dev, "%s %s failed to register V4L2 device\n", HVA_PREFIX, HVA_NAME); goto err_hw; } hva->work_queue = create_workqueue(HVA_NAME); if (!hva->work_queue) { dev_err(dev, "%s %s failed to allocate work queue\n", HVA_PREFIX, HVA_NAME); ret = -ENOMEM; goto err_v4l2; } /* register device */ ret = hva_register_device(hva); if (ret) goto err_work_queue; dev_info(dev, "%s %s registered as /dev/video%d\n", HVA_PREFIX, HVA_NAME, hva->vdev->num); return 0; err_work_queue: destroy_workqueue(hva->work_queue); err_v4l2: v4l2_device_unregister(&hva->v4l2_dev); err_hw: hva_hw_remove(hva); err: return ret; }