hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/media/platform/rcar_fdp1.c
....@@ -2121,9 +2121,7 @@
21212121
21222122 if (ctx->hdl.error) {
21232123 ret = ctx->hdl.error;
2124
- v4l2_ctrl_handler_free(&ctx->hdl);
2125
- kfree(ctx);
2126
- goto done;
2124
+ goto error_ctx;
21272125 }
21282126
21292127 ctx->fh.ctrl_handler = &ctx->hdl;
....@@ -2137,20 +2135,27 @@
21372135
21382136 if (IS_ERR(ctx->fh.m2m_ctx)) {
21392137 ret = PTR_ERR(ctx->fh.m2m_ctx);
2140
-
2141
- v4l2_ctrl_handler_free(&ctx->hdl);
2142
- kfree(ctx);
2143
- goto done;
2138
+ goto error_ctx;
21442139 }
21452140
21462141 /* Perform any power management required */
2147
- pm_runtime_get_sync(fdp1->dev);
2142
+ ret = pm_runtime_resume_and_get(fdp1->dev);
2143
+ if (ret < 0)
2144
+ goto error_pm;
21482145
21492146 v4l2_fh_add(&ctx->fh);
21502147
21512148 dprintk(fdp1, "Created instance: %p, m2m_ctx: %p\n",
21522149 ctx, ctx->fh.m2m_ctx);
21532150
2151
+ mutex_unlock(&fdp1->dev_mutex);
2152
+ return 0;
2153
+
2154
+error_pm:
2155
+ v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
2156
+error_ctx:
2157
+ v4l2_ctrl_handler_free(&ctx->hdl);
2158
+ kfree(ctx);
21542159 done:
21552160 mutex_unlock(&fdp1->dev_mutex);
21562161 return ret;
....@@ -2255,7 +2260,6 @@
22552260 struct fdp1_dev *fdp1;
22562261 struct video_device *vfd;
22572262 struct device_node *fcp_node;
2258
- struct resource *res;
22592263 struct clk *clk;
22602264 unsigned int i;
22612265
....@@ -2282,17 +2286,15 @@
22822286 platform_set_drvdata(pdev, fdp1);
22832287
22842288 /* Memory-mapped registers */
2285
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2286
- fdp1->regs = devm_ioremap_resource(&pdev->dev, res);
2289
+ fdp1->regs = devm_platform_ioremap_resource(pdev, 0);
22872290 if (IS_ERR(fdp1->regs))
22882291 return PTR_ERR(fdp1->regs);
22892292
22902293 /* Interrupt service routine registration */
2291
- fdp1->irq = ret = platform_get_irq(pdev, 0);
2292
- if (ret < 0) {
2293
- dev_err(&pdev->dev, "cannot find IRQ\n");
2294
+ ret = platform_get_irq(pdev, 0);
2295
+ if (ret < 0)
22942296 return ret;
2295
- }
2297
+ fdp1->irq = ret;
22962298
22972299 ret = devm_request_irq(&pdev->dev, fdp1->irq, fdp1_irq_handler, 0,
22982300 dev_name(&pdev->dev), fdp1);
....@@ -2315,8 +2317,10 @@
23152317
23162318 /* Determine our clock rate */
23172319 clk = clk_get(&pdev->dev, NULL);
2318
- if (IS_ERR(clk))
2319
- return PTR_ERR(clk);
2320
+ if (IS_ERR(clk)) {
2321
+ ret = PTR_ERR(clk);
2322
+ goto put_dev;
2323
+ }
23202324
23212325 fdp1->clk_rate = clk_get_rate(clk);
23222326 clk_put(clk);
....@@ -2325,7 +2329,7 @@
23252329 ret = v4l2_device_register(&pdev->dev, &fdp1->v4l2_dev);
23262330 if (ret) {
23272331 v4l2_err(&fdp1->v4l2_dev, "Failed to register video device\n");
2328
- return ret;
2332
+ goto put_dev;
23292333 }
23302334
23312335 /* M2M registration */
....@@ -2355,7 +2359,9 @@
23552359
23562360 /* Power up the cells to read HW */
23572361 pm_runtime_enable(&pdev->dev);
2358
- pm_runtime_get_sync(fdp1->dev);
2362
+ ret = pm_runtime_resume_and_get(fdp1->dev);
2363
+ if (ret < 0)
2364
+ goto disable_pm;
23592365
23602366 hw_version = fdp1_read(fdp1, FD1_IP_INTDATA);
23612367 switch (hw_version) {
....@@ -2384,12 +2390,17 @@
23842390
23852391 return 0;
23862392
2393
+disable_pm:
2394
+ pm_runtime_disable(fdp1->dev);
2395
+
23872396 release_m2m:
23882397 v4l2_m2m_release(fdp1->m2m_dev);
23892398
23902399 unreg_dev:
23912400 v4l2_device_unregister(&fdp1->v4l2_dev);
23922401
2402
+put_dev:
2403
+ rcar_fcp_put(fdp1->fcp);
23932404 return ret;
23942405 }
23952406
....@@ -2401,6 +2412,7 @@
24012412 video_unregister_device(&fdp1->vfd);
24022413 v4l2_device_unregister(&fdp1->v4l2_dev);
24032414 pm_runtime_disable(&pdev->dev);
2415
+ rcar_fcp_put(fdp1->fcp);
24042416
24052417 return 0;
24062418 }