int s5p_mfc_power_off(struct s5p_mfc_dev *dev)
{
#if defined(CONFIG_SOC_EXYNOS5422)
	bts_initialize("pd-mfc", false);
#endif
	atomic_set(&dev->pm.power, 0);

	return pm_runtime_put_sync(dev->pm.device);
}
int s5p_mfc_power_on(struct s5p_mfc_dev *dev)
{
	int ret;
	atomic_set(&dev->pm.power, 1);

	ret = pm_runtime_get_sync(dev->pm.device);

#if defined(CONFIG_SOC_EXYNOS5422)
	bts_initialize("pd-mfc", true);
#endif

	return ret;
}
int s5p_mfc_power_on(struct s5p_mfc_dev *dev)
{
	int ret;
#if defined(CONFIG_SOC_EXYNOS5430)
	struct clk *clk_child = NULL;
	struct clk *clk_parent = NULL;
#endif

	atomic_set(&dev->pm.power, 1);
	MFC_TRACE_DEV("++ Power on\n");

	ret = pm_runtime_get_sync(dev->pm.device);

#if defined(CONFIG_SOC_EXYNOS5422)
	bts_initialize("pd-mfc", true);
#endif

#if defined(CONFIG_SOC_EXYNOS5430)
	if (dev->id == 0) {
		clk_child = clk_get(dev->device, "mout_mphy_pll");
		if (IS_ERR(clk_child)) {
			pr_err("failed to get %s clock\n", __clk_get_name(clk_child));
			return PTR_ERR(clk_child);
		}
		clk_parent = clk_get(dev->device, "fout_mphy_pll");
		if (IS_ERR(clk_parent)) {
			clk_put(clk_child);
			pr_err("failed to get %s clock\n", __clk_get_name(clk_parent));
			return PTR_ERR(clk_parent);
		}
		/* 1. Enable MPHY_PLL */
		clk_prepare_enable(clk_parent);
		/* 2. Set parent as Fout_mphy */
		clk_set_parent(clk_child, clk_parent);
	}
#endif

	MFC_TRACE_DEV("-- Power on: ret(%d)\n", ret);

	return ret;
}
int s5p_mfc_power_off(struct s5p_mfc_dev *dev)
{
#if defined(CONFIG_SOC_EXYNOS5430) || defined(CONFIG_SOC_EXYNOS5433)
	struct clk *clk_child = NULL;
	struct clk *clk_parent = NULL;
#endif

#if defined(CONFIG_SOC_EXYNOS5430)
	struct clk *clk_fout_mphy_pll = NULL;
#endif

#if defined(CONFIG_SOC_EXYNOS5433)
	struct clk *clk_old_parent = NULL;
#endif
	int ret;

	MFC_TRACE_DEV("++ Power off\n");
#if defined(CONFIG_SOC_EXYNOS5422)
	bts_initialize("pd-mfc", false);
#endif

#if defined(CONFIG_SOC_EXYNOS5430)
	if (dev->id == 0) {
		clk_fout_mphy_pll = clk_get(dev->device, "fout_mphy_pll");
		if (IS_ERR(clk_fout_mphy_pll)) {
			pr_err("failed to get %s clock\n", __clk_get_name(clk_fout_mphy_pll));
			return PTR_ERR(clk_fout_mphy_pll);
		}

		clk_child = clk_get(dev->device, "mout_mphy_pll");
		if (IS_ERR(clk_child)) {
			clk_put(clk_fout_mphy_pll);
			pr_err("failed to get %s clock\n", __clk_get_name(clk_child));
			return PTR_ERR(clk_child);
		}
		clk_parent = clk_get(dev->device, "fin_pll");
		if (IS_ERR(clk_parent)) {
			clk_put(clk_child);
			clk_put(clk_fout_mphy_pll);
			pr_err("failed to get %s clock\n", __clk_get_name(clk_parent));
			return PTR_ERR(clk_parent);
		}
		/* 1. Set parent as OSC */
		clk_set_parent(clk_child, clk_parent);
		/* 2. Disable MPHY_PLL */
		clk_disable_unprepare(clk_fout_mphy_pll);
	}
#endif

#if defined(CONFIG_SOC_EXYNOS5433)
	clk_old_parent = clk_get(dev->device, "aclk_mfc_400");
	if (IS_ERR(clk_old_parent)) {
		pr_err("failed to get %s clock\n", __clk_get_name(clk_old_parent));
		return PTR_ERR(clk_old_parent);
	}
	clk_child = clk_get(dev->device, "mout_aclk_mfc_400_user");
	if (IS_ERR(clk_child)) {
		clk_put(clk_old_parent);
		pr_err("failed to get %s clock\n", __clk_get_name(clk_child));
		return PTR_ERR(clk_child);
	}
	clk_parent = clk_get(dev->device, "oscclk");
	if (IS_ERR(clk_parent)) {
		clk_put(clk_child);
		clk_put(clk_old_parent);
		pr_err("failed to get %s clock\n", __clk_get_name(clk_parent));
		return PTR_ERR(clk_parent);
	}
	/* before set mux register, all source clock have to enabled */
	clk_prepare_enable(clk_parent);
	if (clk_set_parent(clk_child, clk_parent)) {
		pr_err("Unable to set parent %s of clock %s \n",
			__clk_get_name(clk_parent), __clk_get_name(clk_child));
	}
	clk_disable_unprepare(clk_parent);
	clk_disable_unprepare(clk_old_parent);

	clk_put(clk_child);
	clk_put(clk_parent);
	clk_put(clk_old_parent);
	/* expected mfc related ref clock value be set 0 */
#endif

	atomic_set(&dev->pm.power, 0);

	ret = pm_runtime_put_sync(dev->pm.device);
	MFC_TRACE_DEV("-- Power off: ret(%d)\n", ret);

	return ret;
}