static int mfc_runtime_resume(struct device *dev) { struct mfc_dev *m_dev = platform_get_drvdata(to_platform_device(dev)); int pre_power; pre_power = atomic_read(&m_dev->pm.power); atomic_set(&m_dev->pm.power, 1); #ifdef SYSMMU_MFC_ON if (pre_power == 0) { mfc_clock_on(); sysmmu_on(SYSMMU_MFC_L); sysmmu_on(SYSMMU_MFC_R); #ifdef CONFIG_VIDEO_MFC_VCM_UMP vcm_set_pgtable_base(VCM_DEV_MFC); #else /* CONFIG_S5P_VMEM or kernel virtual memory allocator */ sysmmu_set_tablebase_pgd(SYSMMU_MFC_L, __pa(swapper_pg_dir)); sysmmu_set_tablebase_pgd(SYSMMU_MFC_R, __pa(swapper_pg_dir)); #endif mfc_clock_off(); } #endif return 0; }
static int mfc_resume(struct device *dev) { struct mfc_dev *m_dev = platform_get_drvdata(to_platform_device(dev)); int ret; u32 timeout; if (atomic_read(&m_dev->inst_cnt) == 0) return 0; #ifdef SYSMMU_MFC_ON mfc_clock_on(); sysmmu_on(SYSMMU_MFC_L); sysmmu_on(SYSMMU_MFC_R); #ifdef CONFIG_VIDEO_MFC_VCM_UMP vcm_set_pgtable_base(VCM_DEV_MFC); #else /* CONFIG_S5P_VMEM or kernel virtual memory allocator */ sysmmu_set_tablebase_pgd(SYSMMU_MFC_L, __pa(swapper_pg_dir)); sysmmu_set_tablebase_pgd(SYSMMU_MFC_R, __pa(swapper_pg_dir)); #endif mfc_clock_off(); #endif mutex_lock(&m_dev->lock); __raw_writel(S5P_INT_LOCAL_PWR_EN, S5P_PMU_MFC_CONF); /* Wait max 1ms */ timeout = 10; while ((__raw_readl(S5P_PMU_MFC_CONF + 0x4) & S5P_INT_LOCAL_PWR_EN) != S5P_INT_LOCAL_PWR_EN) { if (timeout == 0) { printk(KERN_ERR "Power domain MFC enable failed.\n"); break; } timeout--; udelay(100); } ret = mfc_wakeup(m_dev); mutex_unlock(&m_dev->lock); if (ret != MFC_OK) return ret; return 0; }
static int jpeg_setup_controller(struct jpeg_control *ctrl) { #if defined(CONFIG_S5P_SYSMMU_JPEG) sysmmu_on(SYSMMU_JPEG); jpeg_dbg("sysmmu on\n"); /* jpeg hw uses kernel virtual address */ sysmmu_set_tablebase_pgd(SYSMMU_JPEG, __pa(swapper_pg_dir)); #endif atomic_set(&ctrl->in_use, 0); mutex_init(&ctrl->lock); init_waitqueue_head(&ctrl->wq); return 0; }
static int mfc_open(struct inode *inode, struct file *file) { struct mfc_inst_ctx *mfc_ctx; int ret; enum mfc_ret_code retcode; /* prevent invalid reference */ file->private_data = NULL; mutex_lock(&mfcdev->lock); if (!mfcdev->fw.state) { if (mfcdev->fw.requesting) { printk(KERN_INFO "MFC F/W request is on-going, try again\n"); ret = -ENODEV; goto err_fw_state; } printk(KERN_INFO "MFC F/W is not exist, requesting...\n"); ret = request_firmware(&mfcdev->fw.info, MFC_FW_NAME, mfcdev->device); if (ret < 0) { printk(KERN_INFO "failed to copy MFC F/W during open\n"); goto err_fw_state; } } if (atomic_read(&mfcdev->inst_cnt) == 0) { /* reload F/W for first instance again */ mfcdev->fw.state = mfc_load_firmware(mfcdev->fw.info->data, mfcdev->fw.info->size); if (!mfcdev->fw.state) { printk(KERN_ERR "failed to load MFC F/W, MFC will not working\n"); ret = -ENODEV; goto err_fw_state; } else { printk(KERN_INFO "MFC F/W reloaded successfully (size: %d)\n", mfcdev->fw.info->size); } ret = mfc_power_on(); if (ret < 0) { mfc_err("power enable failed\n"); goto err_pwr_enable; } #ifndef CONFIG_PM_RUNTIME #ifdef SYSMMU_MFC_ON mfc_clock_on(); sysmmu_on(SYSMMU_MFC_L); sysmmu_on(SYSMMU_MFC_R); #ifdef CONFIG_VIDEO_MFC_VCM_UMP vcm_set_pgtable_base(VCM_DEV_MFC); #else /* CONFIG_S5P_VMEM or kernel virtual memory allocator */ sysmmu_set_tablebase_pgd(SYSMMU_MFC_L, __pa(swapper_pg_dir)); sysmmu_set_tablebase_pgd(SYSMMU_MFC_R, __pa(swapper_pg_dir)); /* * RMVME: the power-gating work really (on <-> off), * all TBL entry was invalidated already when the power off */ sysmmu_tlb_invalidate(SYSMMU_MFC_L); sysmmu_tlb_invalidate(SYSMMU_MFC_R); #endif mfc_clock_off(); #endif #endif /* MFC hardware initialization */ retcode = mfc_start(mfcdev); if (retcode != MFC_OK) { mfc_err("MFC H/W init failed: %d\n", retcode); ret = -ENODEV; goto err_start_hw; } /* * Indicate that MFC is running */ mfc_is_running = 1; } mfc_ctx = mfc_create_inst(); if (!mfc_ctx) { mfc_err("failed to create instance context\n"); ret = -ENOMEM; goto err_inst_ctx; } mfc_ctx->id = get_free_inst_id(mfcdev); if (mfc_ctx->id < 0) { mfc_destroy_inst(mfc_ctx); ret = -EINVAL; goto err_inst_ctx; } printk(KERN_INFO "MFC instance [%d] opened", mfc_ctx->id); mfc_ctx->dev = mfcdev; atomic_inc(&mfcdev->inst_cnt); mfcdev->inst_ctx[mfc_ctx->id] = mfc_ctx; file->private_data = (struct mfc_inst_ctx *)mfc_ctx; mutex_unlock(&mfcdev->lock); return 0; err_inst_ctx: err_start_hw: if (atomic_read(&mfcdev->inst_cnt) == 0) { if (mfc_power_off() < 0) mfc_err("power disable failed\n"); } err_pwr_enable: err_fw_state: mutex_unlock(&mfcdev->lock); return ret; }
void g2d_sysmmu_on(struct g2d_global *g2d_dev) { g2d_clk_enable(g2d_dev); sysmmu_on(SYSMMU_G2D); g2d_clk_disable(g2d_dev); }