int s5p_mfc_power_on(void) { #ifdef CONFIG_PM_RUNTIME int ret; ret = pm_runtime_get_sync(pm->device); if (ret < 0) goto out; ret = platform_sysmmu_on(p_dev->mem_dev_l); if (ret < 0) goto out_err; ret = platform_sysmmu_on(p_dev->mem_dev_r); if (ret < 0) goto out_err2; return ret; out_err2: platform_sysmmu_off(p_dev->mem_dev_l); out_err: pm_runtime_put_sync(pm->device); out: return ret; #else atomic_set(&pm->power, 1); return 0; #endif }
static int gsc_m2m_start_streaming(struct vb2_queue *q, unsigned int count) { struct gsc_ctx *ctx = q->drv_priv; struct device *dev = &ctx->gsc_dev->pdev->dev; int ret; ret = pm_runtime_get_sync(dev); if (ret < 0) return ret; ret = platform_sysmmu_on(dev); if (ret < 0) pm_runtime_put_sync(dev); return ret > 0 ? 0 : ret; }
static int fimc_lite_open(struct file *file) { struct fimc_lite *fimc = video_drvdata(file); int ret; if (mutex_lock_interruptible(&fimc->lock)) return -ERESTARTSYS; set_bit(ST_FLITE_IN_USE, &fimc->state); ret = pm_runtime_get_sync(&fimc->pdev->dev); if (ret < 0) goto done; ret = platform_sysmmu_on(&fimc->pdev->dev); if (ret < 0) goto err_pm; ret = v4l2_fh_open(file); if (ret < 0) goto done; if (++fimc->ref_count == 1 && fimc->out_path == FIMC_IO_DMA) { ret = fimc_pipeline_initialize(&fimc->pipeline, &fimc->vfd->entity, true); if (ret < 0) { pm_runtime_put_sync(&fimc->pdev->dev); fimc->ref_count--; v4l2_fh_release(file); clear_bit(ST_FLITE_IN_USE, &fimc->state); } fimc_lite_clear_event_counters(fimc); } err_pm: pm_runtime_put(&fimc->pdev->dev); done: mutex_unlock(&fimc->lock); return ret; }
static int __devinit fimc_lite_probe(struct platform_device *pdev) { struct flite_drvdata *drv_data = fimc_lite_get_drvdata(pdev); struct fimc_lite *fimc; struct resource *res; int ret; fimc = devm_kzalloc(&pdev->dev, sizeof(*fimc), GFP_KERNEL); if (!fimc) return -ENOMEM; fimc->index = pdev->id; fimc->variant = drv_data->variant[fimc->index]; fimc->pdev = pdev; init_waitqueue_head(&fimc->irq_queue); spin_lock_init(&fimc->slock); mutex_init(&fimc->lock); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); fimc->regs = devm_request_and_ioremap(&pdev->dev, res); if (fimc->regs == NULL) { dev_err(&pdev->dev, "Failed to obtain io memory\n"); return -ENOENT; } res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); if (res == NULL) { dev_err(&pdev->dev, "Failed to get IRQ resource\n"); return -ENXIO; } ret = fimc_lite_clk_get(fimc); if (ret) return ret; ret = devm_request_irq(&pdev->dev, res->start, flite_irq_handler, 0, dev_name(&pdev->dev), fimc); if (ret) { dev_err(&pdev->dev, "Failed to install irq (%d)\n", ret); goto err_clk; } /* The video node will be created within the subdev's registered() op */ ret = fimc_lite_create_capture_subdev(fimc); if (ret) goto err_clk; platform_set_drvdata(pdev, fimc); pm_runtime_enable(&pdev->dev); ret = pm_runtime_get_sync(&pdev->dev); if (ret < 0) goto err_sd; ret = platform_sysmmu_on(&pdev->dev); if (ret < 0) goto err_pm; fimc->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); if (IS_ERR(fimc->alloc_ctx)) { ret = PTR_ERR(fimc->alloc_ctx); goto err_pm; } pm_runtime_put(&pdev->dev); platform_sysmmu_off(&pdev->dev); dev_dbg(&pdev->dev, "FIMC-LITE.%d registered successfully\n", fimc->index); return 0; err_pm: pm_runtime_put(&pdev->dev); err_sd: fimc_lite_unregister_capture_subdev(fimc); err_clk: fimc_lite_clk_put(fimc); return ret; }