int s5p_tvout_vcm_init(void) { if (vcm_activate(s5p_vcm) < 0) return -1; return 0; }
/* FIXME: check every exception case (goto) */ static int __devinit mfc_probe(struct platform_device *pdev) { struct resource *res; int ret; mfcdev = kzalloc(sizeof(struct mfc_dev), GFP_KERNEL); if (unlikely(mfcdev == NULL)) { dev_err(&pdev->dev, "failed to allocate control memory\n"); return -ENOMEM; } /* init. control structure */ sprintf(mfcdev->name, "%s", MFC_DEV_NAME); mutex_init(&mfcdev->lock); init_waitqueue_head(&mfcdev->wait_sys); init_waitqueue_head(&mfcdev->wait_codec[0]); init_waitqueue_head(&mfcdev->wait_codec[1]); atomic_set(&mfcdev->inst_cnt, 0); #ifdef CONFIG_CPU_FREQ atomic_set(&mfcdev->busfreq_lock_cnt, 0); atomic_set(&mfcdev->cpufreq_lock_cnt, 0); #endif mfcdev->device = &pdev->dev; platform_set_drvdata(pdev, mfcdev); /* get the memory region */ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (unlikely(res == NULL)) { dev_err(&pdev->dev, "no memory resource specified\n"); ret = -ENOENT; goto err_mem_res; } mfcdev->reg.rsrc_start = res->start; mfcdev->reg.rsrc_len = resource_size(res); /* request mem region for MFC register (0x0000 ~ 0xE008) */ res = request_mem_region(mfcdev->reg.rsrc_start, mfcdev->reg.rsrc_len, pdev->name); if (unlikely(res == NULL)) { dev_err(&pdev->dev, "failed to get memory region\n"); ret = -ENOENT; goto err_mem_req; } /* ioremap for MFC register */ mfcdev->reg.base = ioremap(mfcdev->reg.rsrc_start, mfcdev->reg.rsrc_len); if (unlikely(!mfcdev->reg.base)) { dev_err(&pdev->dev, "failed to ioremap memory region\n"); ret = -EINVAL; goto err_mem_map; } init_reg(mfcdev->reg.base); mfcdev->irq = platform_get_irq(pdev, 0); if (unlikely(mfcdev->irq < 0)) { dev_err(&pdev->dev, "no irq resource specified\n"); ret = -ENOENT; goto err_irq_res; } ret = request_irq(mfcdev->irq, mfc_irq, IRQF_DISABLED, mfcdev->name, mfcdev); if (ret) { dev_err(&pdev->dev, "failed to allocate irq (%d)\n", ret); goto err_irq_req; } /* * initialize PM(power, clock) interface */ ret = mfc_init_pm(mfcdev); if (ret < 0) { printk(KERN_ERR "failed to init. MFC PM interface\n"); goto err_pm_if; } /* * initialize memory manager */ ret = mfc_init_mem_mgr(mfcdev); if (ret < 0) { printk(KERN_ERR "failed to init. MFC memory manager\n"); goto err_mem_mgr; } /* * loading firmware */ mfcdev->fw.requesting = 1; ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG, MFC_FW_NAME, &pdev->dev, GFP_KERNEL, pdev, mfc_firmware_request_complete_handler); if (ret) { mfcdev->fw.requesting = 0; dev_err(&pdev->dev, "could not load firmware (err=%d)\n", ret); goto err_fw_req; } #if defined(SYSMMU_MFC_ON) && defined(CONFIG_VIDEO_MFC_VCM_UMP) ret = vcm_activate(mfcdev->vcm_info.sysmmu_vcm); if (ret < 0) { mfc_err("failed to activate VCM: %d", ret); goto err_act_vcm; } #endif /* * initialize buffer manager */ mfc_init_buf(); /* FIXME: final dec & enc */ mfc_init_decoders(); mfc_init_encoders(); ret = misc_register(&mfc_miscdev); if (ret) { mfc_err("MFC can't misc register on minor=%d\n", MFC_MINOR); goto err_misc_reg; } mfc_info("MFC(Multi Function Codec - FIMV v5.x) registered successfully\n"); return 0; err_misc_reg: mfc_final_buf(); #ifdef SYSMMU_MFC_ON #ifdef CONFIG_VIDEO_MFC_VCM_UMP mfc_clock_on(); vcm_deactivate(mfcdev->vcm_info.sysmmu_vcm); mfc_clock_off(); err_act_vcm: #endif mfc_clock_on(); sysmmu_off(SYSMMU_MFC_L); sysmmu_off(SYSMMU_MFC_R); mfc_clock_off(); #endif if (mfcdev->fw.info) release_firmware(mfcdev->fw.info); err_fw_req: /* FIXME: make kenel dump when probe fail */ mfc_clock_on(); mfc_final_mem_mgr(mfcdev); mfc_clock_off(); err_mem_mgr: mfc_final_pm(mfcdev); err_pm_if: free_irq(mfcdev->irq, mfcdev); err_irq_req: err_irq_res: iounmap(mfcdev->reg.base); err_mem_map: release_mem_region(mfcdev->reg.rsrc_start, mfcdev->reg.rsrc_len); err_mem_req: err_mem_res: platform_set_drvdata(pdev, NULL); mutex_destroy(&mfcdev->lock); kfree(mfcdev); return ret; }
int s3cfb_map_default_video_memory(struct s3cfb_global *fbdev, struct fb_info *fb, int fimd_id) { struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_window *win = fb->par; #ifdef CONFIG_VCM struct cma_info mem_info; unsigned int reserved_size; int err; struct vcm_phys *phys = NULL; ump_dd_physical_block ump_memory_description; unsigned int device_virt_start = 0; int frame_size = fix->smem_len / CONFIG_FB_S3C_NR_BUFFERS; struct vcm_res *fb_dev_vcm_res[CONFIG_FB_S3C_NR_BUFFERS]; enum vcm_dev_id id; #else #ifdef CONFIG_S5P_MEM_CMA struct cma_info mem_info; unsigned int reserved_size; int err; #endif #endif #ifdef MALI_USE_UNIFIED_MEMORY_PROVIDER #ifdef CONFIG_VCM int i; unsigned int arg = 0; #ifdef CONFIG_UMP_VCM_ALLOC struct ump_vcm ump_vcm; #endif unsigned int arg = 0; #endif #endif if (win->owner == DMA_MEM_OTHER) return 0; #ifdef CONFIG_VCM phys = kmalloc(sizeof(*phys) + sizeof(*phys->parts), GFP_KERNEL); memset(phys, 0, sizeof(*phys) + sizeof(*phys->parts)); if (fimd_id == 0) id = VCM_DEV_FIMD0; else id = VCM_DEV_FIMD1; err = cma_info(&mem_info, fbdev->dev, 0); if (ERR_PTR(err)) return -ENOMEM; reserved_size = fix->smem_len; fix->smem_start = (dma_addr_t)cma_alloc (fbdev->dev, "fimd", (size_t)reserved_size, 0); fb->screen_base = cma_get_virt(fix->smem_start, reserved_size, 1); fbdev->s5p_vcm = vcm_create_unified((SZ_64M), id, &s3cfb_vcm_driver); if (IS_ERR(fbdev->s5p_vcm)) return PTR_ERR(fbdev->s5p_vcm); if (vcm_activate(fbdev->s5p_vcm)) dev_info(fbdev->dev, "[fb%d] : VCM activated", win->id); phys->count = 1; phys->size = fix->smem_len; phys->free = NULL; phys->parts[0].size = fix->smem_len; phys->parts[0].start = fix->smem_start; win->s5p_vcm_res = vcm_map(fbdev->s5p_vcm, phys, 0); device_virt_start = win->s5p_vcm_res->start; for (i = 0; i < CONFIG_FB_S3C_NR_BUFFERS; i++) { fb_dev_vcm_res[i] = kzalloc(sizeof(struct vcm_res), GFP_KERNEL); win->s3cfb_vcm[i].dev_vcm_res = fb_dev_vcm_res[i]; win->s3cfb_vcm[i].dev_vcm_res->start = device_virt_start + frame_size * i; win->s3cfb_vcm[i].dev_vcm_res->bound_size = frame_size; win->s3cfb_vcm[i].dev_vcm_res->res_size = frame_size; win->s3cfb_vcm[i].dev_vcm = fbdev->s5p_vcm; win->s3cfb_vcm[i].dev_vcm_res->vcm = fbdev->s5p_vcm; if (IS_ERR(win->s3cfb_vcm[i].dev_vcm_res)) return -ENOMEM; } #else #ifdef CONFIG_S5P_MEM_CMA err = cma_info(&mem_info, fbdev->dev, 0); if (ERR_PTR(err)) return -ENOMEM; reserved_size = mem_info.total_size; fix->smem_start = (dma_addr_t)cma_alloc (fbdev->dev, "fimd", (size_t)reserved_size, 0); fb->screen_base = cma_get_virt(fix->smem_start, reserved_size, 1); #elif defined(CONFIG_S5P_MEM_BOOTMEM) fix->smem_start = s5p_get_media_memory_bank(S5P_MDEV_FIMD, 1); fix->smem_len = s5p_get_media_memsize_bank(S5P_MDEV_FIMD, 1); fb->screen_base = ioremap_wc(fix->smem_start, fix->smem_len); #endif #endif memset(fb->screen_base, 0, fix->smem_len); win->owner = DMA_MEM_FIMD; #if MALI_USE_UNIFIED_MEMORY_PROVIDER #ifdef CONFIG_VCM #ifdef CONFIG_UMP_VCM_ALLOC for (i = 0; i < CONFIG_FB_S3C_NR_BUFFERS; i++) { ump_vcm.vcm = win->s3cfb_vcm[i].dev_vcm; ump_vcm.vcm_res = win->s3cfb_vcm[i].dev_vcm_res; ump_vcm.dev_id = id; arg = (unsigned int)&ump_vcm; ump_memory_description.addr = fix->smem_start + ((fix->smem_len / CONFIG_FB_S3C_NR_BUFFERS) * i); ump_memory_description.size = fix->smem_len / CONFIG_FB_S3C_NR_BUFFERS; win->ump_wrapped_buffer[i] = ump_dd_handle_create_from_phys_blocks (&ump_memory_description, 1); if (ump_dd_vcm_attribute_set(win->ump_wrapped_buffer[i], arg)) return -ENOMEM; } #else if (s3cfb_ump_wrapper(fix, arg, 0, win)) { dev_info(fbdev->dev, "[fb%d] : Wrapped UMP memory : %x\n" , win->id, (unsigned int)ump_wrapped_buffer); s3cfb_unmap_video_memory(fbdev, fb); return -ENOMEM; } #endif #endif #endif return 0; }