| .. | .. |
|---|
| 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 | } |
|---|