コード例 #1
0
ファイル: clk-prcmu.c プロジェクト: 0x000000FF/edison-linux
static int clk_prcmu_opp_prepare(struct clk_hw *hw)
{
	int err;
	struct clk_prcmu *clk = to_clk_prcmu(hw);

	if (!clk->opp_requested) {
		err = prcmu_qos_add_requirement(PRCMU_QOS_APE_OPP,
						(char *)__clk_get_name(hw->clk),
						100);
		if (err) {
			pr_err("clk_prcmu: %s fail req APE OPP for %s.\n",
				__func__, __clk_get_name(hw->clk));
			return err;
		}
		clk->opp_requested = 1;
	}

	err = prcmu_request_clock(clk->cg_sel, true);
	if (err) {
		prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP,
					(char *)__clk_get_name(hw->clk));
		clk->opp_requested = 0;
		return err;
	}

	clk->is_prepared = 1;
	return 0;
}
コード例 #2
0
static void ws2401_dpi_mcde_panel_early_suspend(
    struct early_suspend *earlysuspend)
{
    struct ws2401_dpi *lcd = container_of(earlysuspend,
                                          struct ws2401_dpi,
                                          earlysuspend);
    pm_message_t dummy;

    if (lcd->pd->bl_ctrl)
        lcd->bd_enable = FALSE;
#ifdef ESD_OPERATION
    if (lcd->esd_enable) {

        lcd->esd_enable = 0;
        set_irq_type(GPIO_TO_IRQ(lcd->esd_port), IRQF_TRIGGER_NONE);
        disable_irq_nosync(GPIO_TO_IRQ(lcd->esd_port));

        if (!list_empty(&(lcd->esd_work.entry))) {
            cancel_work_sync(&(lcd->esd_work));
            pr_info("%s cancel_work_sync", __func__);
        }

        pr_info("%s change lcd->esd_enable :%d", __func__,
                lcd->esd_enable);
    }
#endif

    ws2401_dpi_mcde_panel_suspend(lcd->mdd, dummy);

    prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP,
                                 "codina_lcd_dpi");
}
コード例 #3
0
static void s6d27a1_release_opp(struct s6d27a1_dpi *lcd)
{
	if (lcd->opp_is_requested) {
		prcmu_qos_remove_requirement(PRCMU_QOS_DDR_OPP, LCD_DRIVER_NAME_S6D27A1);
		lcd->opp_is_requested = false;
		dev_dbg(lcd->dev, "DDR OPP removed\n");
	}
}
コード例 #4
0
_mali_osk_errcode_t mali_platform_deinit()
{
	destroy_workqueue(mali_utilization_workqueue);
	regulator_put(regulator);
	clk_put(clk_sga);

#if CONFIG_HAS_WAKELOCK
	wake_lock_destroy(&wakelock);
#endif
	kobject_put(mali_kobject);
	is_running = false;
	mali_last_utilization = 0;
	prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP, "mali");
	prcmu_qos_remove_requirement(PRCMU_QOS_DDR_OPP, "mali");
	is_initialized = false;
	MALI_DEBUG_PRINT(2, ("SGA terminated.\n"));
	MALI_SUCCESS;
}
コード例 #5
0
static void ws2401_work_opp_timeout_function(struct work_struct *work)
{
	struct ws2401_lcd *lcd = container_of(work,
		struct ws2401_lcd,
		opp_timeout_work.work);

	dev_vdbg(&lcd->mdd->dev, "%s: display update timeout\n",
		__func__);

	prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP, (char *)"ws2401");
	lcd->opp_is_requested = false;
}
コード例 #6
0
static int __init performance_register(void)
{
	int ret_mmc;
	int ret_wlan;
	int ret;

#ifdef CONFIG_MMC_BLOCK
	ret_mmc = prcmu_qos_add_requirement(PRCMU_QOS_ARM_KHZ, "mmc",
					    PRCMU_QOS_DEFAULT_VALUE);
	if (!ret_mmc)
		ret_mmc = prcmu_qos_add_requirement(PRCMU_QOS_APE_OPP, "mmc",
						    PRCMU_QOS_DEFAULT_VALUE);
	if (!ret_mmc)
		ret_mmc = prcmu_qos_add_requirement(PRCMU_QOS_DDR_OPP, "mmc",
						    PRCMU_QOS_DEFAULT_VALUE);
	if (ret_mmc) {
		pr_err("%s: Failed to add PRCMU QoS req for mmc\n", __func__);
		prcmu_qos_remove_requirement(PRCMU_QOS_ARM_KHZ, "mmc");
		prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP, "mmc");
		prcmu_qos_remove_requirement(PRCMU_QOS_DDR_OPP, "mmc");
	} else {
		INIT_DELAYED_WORK_DEFERRABLE(&work_mmc, mmc_load);
		schedule_delayed_work(&work_mmc,
				      msecs_to_jiffies(perf_mmc_probe_delay));
	}
#endif

	ret_wlan = prcmu_qos_add_requirement(PRCMU_QOS_ARM_KHZ, "wlan",
					     PRCMU_QOS_DEFAULT_VALUE);
	if (!ret_wlan)
		ret_wlan = prcmu_qos_add_requirement(PRCMU_QOS_APE_OPP, "wlan",
						     PRCMU_QOS_DEFAULT_VALUE);
	if (!ret_wlan)
		ret_wlan = prcmu_qos_add_requirement(PRCMU_QOS_DDR_OPP, "wlan",
						     PRCMU_QOS_DEFAULT_VALUE);
	if (ret_wlan) {
		pr_err("%s: Failed to add PRCMU QoS req for wlan\n", __func__);
		prcmu_qos_remove_requirement(PRCMU_QOS_ARM_KHZ, "wlan");
		prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP, "wlan");
		prcmu_qos_remove_requirement(PRCMU_QOS_DDR_OPP, "wlan");
	} else {
		INIT_DELAYED_WORK_DEFERRABLE(&work_wlan_workaround, wlan_load);
		schedule_delayed_work_on(0, &work_wlan_workaround,
					 msecs_to_jiffies(wlan_probe_delay));
	}

	performance_kobject = kobject_create_and_add("performance", kernel_kobj);
	if (!performance_kobject) {
		pr_err("[Performance] Failed to create kobject interface\n");
	}
	ret = sysfs_create_group(performance_kobject, &performance_interface_group);
	if (ret) {
		kobject_put(performance_kobject);
	}

	/* Only return one error code */
	return ret_mmc ? ret_mmc : (ret_wlan ? ret_wlan : ret);
}
コード例 #7
0
ファイル: ux500_msp_dai.c プロジェクト: asmalldev/linux
static int ux500_msp_drv_remove(struct platform_device *pdev)
{
	struct ux500_msp_i2s_drvdata *drvdata = dev_get_drvdata(&pdev->dev);

	ux500_pcm_unregister_platform(pdev);

	snd_soc_unregister_component(&pdev->dev);

	prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP, "ux500_msp_i2s");

	ux500_msp_i2s_cleanup_msp(pdev, drvdata->msp);

	return 0;
}
コード例 #8
0
static int request_ape_opp100(bool enable)
{
	static unsigned int requests;

	if (enable) {
	       if (0 == requests++) {
		       return prcmu_qos_add_requirement(PRCMU_QOS_APE_OPP,
			       "clock", 100);
	       }
	} else if (1 == requests--) {
		prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP, "clock");
	}
	return 0;
}
コード例 #9
0
/* Rationale behind the values for:
* MALI_HIGH_LEVEL_UTILIZATION_LIMIT and MALI_LOW_LEVEL_UTILIZATION_LIMIT
* When operating at half clock frequency a faster clock is requested when
* reaching 75% utilization. When operating at full clock frequency a slower
* clock is requested when reaching 25% utilization. There is a margin of 25%
* at the high range of the slow clock to avoid complete saturation of the
* hardware and there is some overlap to avoid an oscillating situation where
* the clock goes back and forth from high to low.
*
* Utilization on full speed clock
* 0               64             128             192              255
* |---------------|---------------|---------------|---------------|
*                 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
*                 |       ^
*                 V       |
* XXXXXXXXXXXXXXXXXXXXXXXXX
* 0       64     128     192      255
* |-------|-------|-------|-------|
* Utilization on half speed clock
*/
void mali_utilization_function(struct work_struct *ptr)
{
	/*By default, platform start with 50% APE OPP and 25% DDR OPP*/
	static u32 has_requested_low = 1;

	if (last_utilization > MALI_LOW_TO_HIGH_LEVEL_UTILIZATION_LIMIT) {
		if (has_requested_low) {
			MALI_DEBUG_PRINT(5, ("MALI GPU utilization: %u SIGNAL_HIGH\n", last_utilization));
			/*Request 100% APE_OPP.*/
			if (prcmu_qos_add_requirement(PRCMU_QOS_APE_OPP, "mali", 100)) {
				MALI_DEBUG_PRINT(2, ("MALI 100% APE_OPP failed\n"));
				return;
			}
			/*
			* Since the utilization values will be reported higher
			* if DDR_OPP is lowered, we also request 100% DDR_OPP.
			*/
			if (prcmu_qos_add_requirement(PRCMU_QOS_DDR_OPP, "mali", 100)) {
				MALI_DEBUG_PRINT(2, ("MALI 100% DDR_OPP failed\n"));
				return;
			}
			has_requested_low = 0;
		}
	} else {
		if (last_utilization < MALI_HIGH_TO_LOW_LEVEL_UTILIZATION_LIMIT) {
			if (!has_requested_low) {
				/*Remove APE_OPP and DDR_OPP requests*/
				prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP, "mali");
				prcmu_qos_remove_requirement(PRCMU_QOS_DDR_OPP, "mali");
				MALI_DEBUG_PRINT(5, ("MALI GPU utilization: %u SIGNAL_LOW\n", last_utilization));
				has_requested_low = 1;
			}
		}
	}
	MALI_DEBUG_PRINT(5, ("MALI GPU utilization: %u\n", last_utilization));
}
コード例 #10
0
ファイル: ux500_msp_dai.c プロジェクト: hackeran/linux-netmap
static int __devexit ux500_msp_drv_remove(struct platform_device *pdev)
{
    struct ux500_msp_i2s_drvdata *drvdata = dev_get_drvdata(&pdev->dev);

    snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(ux500_msp_dai_drv));

    devm_regulator_put(drvdata->reg_vape);
    prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP, "ux500_msp_i2s");

    clk_put(drvdata->clk);

    ux500_msp_i2s_cleanup_msp(pdev, drvdata->msp);

    return 0;
}
コード例 #11
0
ファイル: clk-prcmu.c プロジェクト: 0x000000FF/edison-linux
static void clk_prcmu_opp_unprepare(struct clk_hw *hw)
{
	struct clk_prcmu *clk = to_clk_prcmu(hw);

	if (prcmu_request_clock(clk->cg_sel, false)) {
		pr_err("clk_prcmu: %s failed to disable %s.\n", __func__,
			__clk_get_name(hw->clk));
		return;
	}

	if (clk->opp_requested) {
		prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP,
					(char *)__clk_get_name(hw->clk));
		clk->opp_requested = 0;
	}

	clk->is_prepared = 0;
}
コード例 #12
0
static int ws2401_platform_disable(struct mcde_display_device *ddev)
{
	int ret = 0;
	struct ws2401_lcd *lcd = NULL;

	lcd = dev_get_drvdata(&ddev->dev);

	if (!lcd->pd->no_bl_ctrl) {
		/* switch backlight off */
		gpio_set_value(lcd->pd->bl_en_gpio, 0);
	}
	/* Remove OPP request */
	if (ddev->port->mode == MCDE_PORTMODE_CMD)
		cancel_delayed_work(&lcd->opp_timeout_work);
	prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP, (char *)"ws2401");
	lcd->opp_is_requested = false;

	if (lcd->pd->power_on_gpio)
		gpio_set_value(lcd->pd->power_on_gpio, !lcd->pd->power_on_high);

	return ret;
}
コード例 #13
0
int mmio_cam_desinitboard(
		struct mmio_info *info)
{
	int err = 0;

	dev_dbg(info->dev, "%s\n", __func__);

	err = info->pdata->config_i2c_pins(info->pdata, MMIO_DEACTIVATE_I2C);

	if (err) {
		dev_err(info->dev,
				"Failed to disable I2C: %d\n",
				err);
		goto out;
	}

	info->pdata->platform_exit(info->pdata);

	prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP,
			(char *)info->misc_dev.name);

out:
	return err;
}