.. | .. |
---|
2121 | 2121 | |
---|
2122 | 2122 | if (ctx->hdl.error) { |
---|
2123 | 2123 | ret = ctx->hdl.error; |
---|
2124 | | - v4l2_ctrl_handler_free(&ctx->hdl); |
---|
2125 | | - kfree(ctx); |
---|
2126 | | - goto done; |
---|
| 2124 | + goto error_ctx; |
---|
2127 | 2125 | } |
---|
2128 | 2126 | |
---|
2129 | 2127 | ctx->fh.ctrl_handler = &ctx->hdl; |
---|
.. | .. |
---|
2137 | 2135 | |
---|
2138 | 2136 | if (IS_ERR(ctx->fh.m2m_ctx)) { |
---|
2139 | 2137 | 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; |
---|
2144 | 2139 | } |
---|
2145 | 2140 | |
---|
2146 | 2141 | /* 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; |
---|
2148 | 2145 | |
---|
2149 | 2146 | v4l2_fh_add(&ctx->fh); |
---|
2150 | 2147 | |
---|
2151 | 2148 | dprintk(fdp1, "Created instance: %p, m2m_ctx: %p\n", |
---|
2152 | 2149 | ctx, ctx->fh.m2m_ctx); |
---|
2153 | 2150 | |
---|
| 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); |
---|
2154 | 2159 | done: |
---|
2155 | 2160 | mutex_unlock(&fdp1->dev_mutex); |
---|
2156 | 2161 | return ret; |
---|
.. | .. |
---|
2255 | 2260 | struct fdp1_dev *fdp1; |
---|
2256 | 2261 | struct video_device *vfd; |
---|
2257 | 2262 | struct device_node *fcp_node; |
---|
2258 | | - struct resource *res; |
---|
2259 | 2263 | struct clk *clk; |
---|
2260 | 2264 | unsigned int i; |
---|
2261 | 2265 | |
---|
.. | .. |
---|
2282 | 2286 | platform_set_drvdata(pdev, fdp1); |
---|
2283 | 2287 | |
---|
2284 | 2288 | /* 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); |
---|
2287 | 2290 | if (IS_ERR(fdp1->regs)) |
---|
2288 | 2291 | return PTR_ERR(fdp1->regs); |
---|
2289 | 2292 | |
---|
2290 | 2293 | /* 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) |
---|
2294 | 2296 | return ret; |
---|
2295 | | - } |
---|
| 2297 | + fdp1->irq = ret; |
---|
2296 | 2298 | |
---|
2297 | 2299 | ret = devm_request_irq(&pdev->dev, fdp1->irq, fdp1_irq_handler, 0, |
---|
2298 | 2300 | dev_name(&pdev->dev), fdp1); |
---|
.. | .. |
---|
2315 | 2317 | |
---|
2316 | 2318 | /* Determine our clock rate */ |
---|
2317 | 2319 | 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 | + } |
---|
2320 | 2324 | |
---|
2321 | 2325 | fdp1->clk_rate = clk_get_rate(clk); |
---|
2322 | 2326 | clk_put(clk); |
---|
.. | .. |
---|
2325 | 2329 | ret = v4l2_device_register(&pdev->dev, &fdp1->v4l2_dev); |
---|
2326 | 2330 | if (ret) { |
---|
2327 | 2331 | v4l2_err(&fdp1->v4l2_dev, "Failed to register video device\n"); |
---|
2328 | | - return ret; |
---|
| 2332 | + goto put_dev; |
---|
2329 | 2333 | } |
---|
2330 | 2334 | |
---|
2331 | 2335 | /* M2M registration */ |
---|
.. | .. |
---|
2355 | 2359 | |
---|
2356 | 2360 | /* Power up the cells to read HW */ |
---|
2357 | 2361 | 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; |
---|
2359 | 2365 | |
---|
2360 | 2366 | hw_version = fdp1_read(fdp1, FD1_IP_INTDATA); |
---|
2361 | 2367 | switch (hw_version) { |
---|
.. | .. |
---|
2384 | 2390 | |
---|
2385 | 2391 | return 0; |
---|
2386 | 2392 | |
---|
| 2393 | +disable_pm: |
---|
| 2394 | + pm_runtime_disable(fdp1->dev); |
---|
| 2395 | + |
---|
2387 | 2396 | release_m2m: |
---|
2388 | 2397 | v4l2_m2m_release(fdp1->m2m_dev); |
---|
2389 | 2398 | |
---|
2390 | 2399 | unreg_dev: |
---|
2391 | 2400 | v4l2_device_unregister(&fdp1->v4l2_dev); |
---|
2392 | 2401 | |
---|
| 2402 | +put_dev: |
---|
| 2403 | + rcar_fcp_put(fdp1->fcp); |
---|
2393 | 2404 | return ret; |
---|
2394 | 2405 | } |
---|
2395 | 2406 | |
---|
.. | .. |
---|
2401 | 2412 | video_unregister_device(&fdp1->vfd); |
---|
2402 | 2413 | v4l2_device_unregister(&fdp1->v4l2_dev); |
---|
2403 | 2414 | pm_runtime_disable(&pdev->dev); |
---|
| 2415 | + rcar_fcp_put(fdp1->fcp); |
---|
2404 | 2416 | |
---|
2405 | 2417 | return 0; |
---|
2406 | 2418 | } |
---|