.. | .. |
---|
499 | 499 | { |
---|
500 | 500 | struct bdisp_ctx *ctx = q->drv_priv; |
---|
501 | 501 | struct vb2_v4l2_buffer *buf; |
---|
502 | | - int ret = pm_runtime_get_sync(ctx->bdisp_dev->dev); |
---|
| 502 | + int ret = pm_runtime_resume_and_get(ctx->bdisp_dev->dev); |
---|
503 | 503 | |
---|
504 | 504 | if (ret < 0) { |
---|
505 | 505 | dev_err(ctx->bdisp_dev->dev, "failed to set runtime PM\n"); |
---|
.. | .. |
---|
687 | 687 | struct bdisp_ctx *ctx = fh_to_ctx(fh); |
---|
688 | 688 | struct bdisp_dev *bdisp = ctx->bdisp_dev; |
---|
689 | 689 | |
---|
690 | | - strlcpy(cap->driver, bdisp->pdev->name, sizeof(cap->driver)); |
---|
691 | | - strlcpy(cap->card, bdisp->pdev->name, sizeof(cap->card)); |
---|
| 690 | + strscpy(cap->driver, bdisp->pdev->name, sizeof(cap->driver)); |
---|
| 691 | + strscpy(cap->card, bdisp->pdev->name, sizeof(cap->card)); |
---|
692 | 692 | snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s%d", |
---|
693 | 693 | BDISP_NAME, bdisp->id); |
---|
694 | | - |
---|
695 | | - cap->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M; |
---|
696 | | - |
---|
697 | | - cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; |
---|
698 | | - |
---|
699 | 694 | return 0; |
---|
700 | 695 | } |
---|
701 | 696 | |
---|
.. | .. |
---|
1058 | 1053 | bdisp->vdev.lock = &bdisp->lock; |
---|
1059 | 1054 | bdisp->vdev.vfl_dir = VFL_DIR_M2M; |
---|
1060 | 1055 | bdisp->vdev.v4l2_dev = &bdisp->v4l2_dev; |
---|
| 1056 | + bdisp->vdev.device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M; |
---|
1061 | 1057 | snprintf(bdisp->vdev.name, sizeof(bdisp->vdev.name), "%s.%d", |
---|
1062 | 1058 | BDISP_NAME, bdisp->id); |
---|
1063 | 1059 | |
---|
.. | .. |
---|
1070 | 1066 | return PTR_ERR(bdisp->m2m.m2m_dev); |
---|
1071 | 1067 | } |
---|
1072 | 1068 | |
---|
1073 | | - ret = video_register_device(&bdisp->vdev, VFL_TYPE_GRABBER, -1); |
---|
| 1069 | + ret = video_register_device(&bdisp->vdev, VFL_TYPE_VIDEO, -1); |
---|
1074 | 1070 | if (ret) { |
---|
1075 | 1071 | dev_err(bdisp->dev, |
---|
1076 | 1072 | "%s(): failed to register video device\n", __func__); |
---|
.. | .. |
---|
1278 | 1274 | if (!IS_ERR(bdisp->clock)) |
---|
1279 | 1275 | clk_unprepare(bdisp->clock); |
---|
1280 | 1276 | |
---|
| 1277 | + destroy_workqueue(bdisp->work_queue); |
---|
| 1278 | + |
---|
1281 | 1279 | dev_dbg(&pdev->dev, "%s driver unloaded\n", pdev->name); |
---|
1282 | 1280 | |
---|
1283 | 1281 | return 0; |
---|
.. | .. |
---|
1312 | 1310 | init_waitqueue_head(&bdisp->irq_queue); |
---|
1313 | 1311 | INIT_DELAYED_WORK(&bdisp->timeout_work, bdisp_irq_timeout); |
---|
1314 | 1312 | bdisp->work_queue = create_workqueue(BDISP_NAME); |
---|
| 1313 | + if (!bdisp->work_queue) |
---|
| 1314 | + return -ENOMEM; |
---|
1315 | 1315 | |
---|
1316 | 1316 | spin_lock_init(&bdisp->slock); |
---|
1317 | 1317 | mutex_init(&bdisp->lock); |
---|
.. | .. |
---|
1321 | 1321 | bdisp->regs = devm_ioremap_resource(dev, res); |
---|
1322 | 1322 | if (IS_ERR(bdisp->regs)) { |
---|
1323 | 1323 | dev_err(dev, "failed to get regs\n"); |
---|
1324 | | - return PTR_ERR(bdisp->regs); |
---|
| 1324 | + ret = PTR_ERR(bdisp->regs); |
---|
| 1325 | + goto err_wq; |
---|
1325 | 1326 | } |
---|
1326 | 1327 | |
---|
1327 | 1328 | bdisp->clock = devm_clk_get(dev, BDISP_NAME); |
---|
1328 | 1329 | if (IS_ERR(bdisp->clock)) { |
---|
1329 | 1330 | dev_err(dev, "failed to get clock\n"); |
---|
1330 | | - return PTR_ERR(bdisp->clock); |
---|
| 1331 | + ret = PTR_ERR(bdisp->clock); |
---|
| 1332 | + goto err_wq; |
---|
1331 | 1333 | } |
---|
1332 | 1334 | |
---|
1333 | 1335 | ret = clk_prepare(bdisp->clock); |
---|
1334 | 1336 | if (ret < 0) { |
---|
1335 | 1337 | dev_err(dev, "clock prepare failed\n"); |
---|
1336 | 1338 | bdisp->clock = ERR_PTR(-EINVAL); |
---|
1337 | | - return ret; |
---|
| 1339 | + goto err_wq; |
---|
1338 | 1340 | } |
---|
1339 | 1341 | |
---|
1340 | 1342 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
---|
.. | .. |
---|
1360 | 1362 | } |
---|
1361 | 1363 | |
---|
1362 | 1364 | /* Debug */ |
---|
1363 | | - ret = bdisp_debugfs_create(bdisp); |
---|
1364 | | - if (ret) { |
---|
1365 | | - dev_err(dev, "failed to create debugfs\n"); |
---|
1366 | | - goto err_v4l2; |
---|
1367 | | - } |
---|
| 1365 | + bdisp_debugfs_create(bdisp); |
---|
1368 | 1366 | |
---|
1369 | 1367 | /* Power management */ |
---|
1370 | 1368 | pm_runtime_enable(dev); |
---|
1371 | | - ret = pm_runtime_get_sync(dev); |
---|
| 1369 | + ret = pm_runtime_resume_and_get(dev); |
---|
1372 | 1370 | if (ret < 0) { |
---|
1373 | 1371 | dev_err(dev, "failed to set PM\n"); |
---|
1374 | | - goto err_pm; |
---|
| 1372 | + goto err_remove; |
---|
1375 | 1373 | } |
---|
1376 | 1374 | |
---|
1377 | 1375 | /* Filters */ |
---|
.. | .. |
---|
1399 | 1397 | bdisp_hw_free_filters(bdisp->dev); |
---|
1400 | 1398 | err_pm: |
---|
1401 | 1399 | pm_runtime_put(dev); |
---|
| 1400 | +err_remove: |
---|
1402 | 1401 | bdisp_debugfs_remove(bdisp); |
---|
1403 | | -err_v4l2: |
---|
1404 | 1402 | v4l2_device_unregister(&bdisp->v4l2_dev); |
---|
1405 | 1403 | err_clk: |
---|
1406 | 1404 | if (!IS_ERR(bdisp->clock)) |
---|
1407 | 1405 | clk_unprepare(bdisp->clock); |
---|
1408 | | - |
---|
| 1406 | +err_wq: |
---|
| 1407 | + destroy_workqueue(bdisp->work_queue); |
---|
1409 | 1408 | return ret; |
---|
1410 | 1409 | } |
---|
1411 | 1410 | |
---|