コード例 #1
0
static void mali_boost_update(void)
{
	u8 vape;
	u32 pll;

	if (boost_required) {
		vape = mali_dvfs[boost_high].vape_raw;
		pll = mali_dvfs[boost_high].clkpll;

		pr_err("[Mali] @%u kHz - Boost\n", mali_dvfs[boost_high].freq);

		prcmu_abb_write(AB8500_REGU_CTRL2,
			AB8500_VAPE_SEL1,
			&vape,
			1);
		prcmu_write(PRCMU_PLLSOC0, pll);
		boost_working = true;
	} else {
		vape = mali_dvfs[boost_low].vape_raw;
		pll = mali_dvfs[boost_low].clkpll;

		pr_err("[Mali] @%u kHz - Deboost\n", mali_dvfs[boost_low].freq);

		prcmu_write(PRCMU_PLLSOC0, pll);
		prcmu_abb_write(AB8500_REGU_CTRL2,
			AB8500_VAPE_SEL1,
			&vape,
			1);

		boost_working = false;
	}
}
コード例 #2
0
ファイル: pm.c プロジェクト: ChronoMonochrome/Chrono_Kernel-1
void ux500_pm_prcmu_copy_gic_settings(void)
{
	u32 er; /* Enable register */
	int i;

	for (i = 0; i < GIC_NUMBER_SPI_REGS; i++) { /* 4*32 SPI interrupts */
		/* +1 due to skip STI and PPI */
		er = readl_relaxed(__io_address(U8500_GIC_DIST_BASE) +
			   GIC_DIST_ENABLE_SET + (i + 1) * 4);
		prcmu_write(PRCM_ARMITMSK31TO0 + i * 4, er);
	}
}
コード例 #3
0
static void mali_clock_apply(u32 idx)
{
	u8 vape;
	u32 pll;

	vape = mali_dvfs[idx].vape_raw;
	pll = mali_dvfs[idx].clkpll;

	prcmu_abb_write(AB8500_REGU_CTRL2, 
		AB8500_VAPE_SEL1, 
		&vape, 
		1);
	prcmu_write(PRCMU_PLLSOC0, pll);
}
コード例 #4
0
static void ux540_pm_prcmu_copy_gic_settings(void)
{
	u32 er; /* Enable register */
	int i, j;

	u8500_pm_prcmu_copy_gic_settings();

	i = U8500_GIC_DIST_SPI_REGS_NB;
	for (j = 0; i < U9540_GIC_DIST_SPI_REGS_NB; i++, j++) {
		/* +1 due to skip STI and PPI */
		er = readl_relaxed(__io_address(U8500_GIC_DIST_BASE) +
			   GIC_DIST_ENABLE_SET + (i + 1) * 4);
		prcmu_write(PRCM_ARMITMSK159TO128 + j * 4, er);
	}
}
コード例 #5
0
static void release_link_reset(u8 link)
{
	u32 value;

	value = prcmu_read(DB8500_PRCM_DSI_SW_RESET);
	switch (link) {
	case 0:
		value |= DB8500_PRCM_DSI_SW_RESET_DSI0_SW_RESETN;
		break;
	case 1:
		value |= DB8500_PRCM_DSI_SW_RESET_DSI1_SW_RESETN;
		break;
	case 2:
		value |= DB8500_PRCM_DSI_SW_RESET_DSI2_SW_RESETN;
		break;
	default:
		break;
	}
	prcmu_write(DB8500_PRCM_DSI_SW_RESET, value);
}
コード例 #6
0
_mali_osk_errcode_t mali_platform_init()
{
	int ret;

	is_running = false;
	mali_last_utilization = 0;

	if (!is_initialized) {

		prcmu_write(PRCMU_PLLSOC0, PRCMU_PLLSOC0_INIT);
		prcmu_write(PRCMU_SGACLK,  PRCMU_SGACLK_INIT);
		mali_boost_init();

		mali_utilization_workqueue = create_singlethread_workqueue("mali_utilization_workqueue");
		if (NULL == mali_utilization_workqueue) {
			MALI_DEBUG_PRINT(2, ("%s: Failed to setup workqueue %s\n", __func__, "mali_utilization_workqueue"));
			goto error;
		}

		INIT_WORK(&mali_utilization_work, mali_utilization_function);
		//TODO register a notifier block with prcmu opp update func to monitor ape opp
		INIT_DELAYED_WORK(&mali_boost_delayedwork, mali_boost_work);

		regulator = regulator_get(NULL, "v-mali");
		if (IS_ERR(regulator)) {
			MALI_DEBUG_PRINT(2, ("%s: Failed to get regulator %s\n", __func__, "v-mali"));
			goto error;
		}

		clk_sga = clk_get_sys("mali", NULL);
		if (IS_ERR(clk_sga)) {
			regulator_put(regulator);
			MALI_DEBUG_PRINT(2, ("%s: Failed to get clock %s\n", __func__, "mali"));
			goto error;
		}

#if CONFIG_HAS_WAKELOCK
		wake_lock_init(&wakelock, WAKE_LOCK_SUSPEND, "mali_wakelock");
#endif

		mali_kobject = kobject_create_and_add("mali", kernel_kobj);
		if (!mali_kobject) {
			pr_err("[Mali] Failed to create kobject interface\n");
		}

		ret = sysfs_create_group(mali_kobject, &mali_interface_group);
		if (ret) {
			kobject_put(mali_kobject);
		}

		prcmu_qos_add_requirement(PRCMU_QOS_APE_OPP, "mali", PRCMU_QOS_DEFAULT_VALUE);
		prcmu_qos_add_requirement(PRCMU_QOS_DDR_OPP, "mali", PRCMU_QOS_DEFAULT_VALUE);

		pr_info("[Mali] DB8500 GPU OC Initialized (%s)\n", MALI_UX500_VERSION);

		is_initialized = true;
	}

	MALI_SUCCESS;
error:
	MALI_DEBUG_PRINT(1, ("SGA initialization failed.\n"));
	MALI_ERROR(_MALI_OSK_ERR_FAULT);
}