示例#1
0
ssize_t clk_rate_store(struct kobject *kobj, struct kobj_attribute *attr,
		const char *buf, size_t n)
{
	struct dvfs_node *clk_dvfs_node = NULL;
	char cmd[20], clk_name[20], msg[50];
	int rate;
	printk("%s: %s\n", __func__, buf);
	sscanf(buf, "%s %s %d", cmd, clk_name, &rate);

	clk_dvfs_node = clk_get_dvfs_node(clk_name);
	if (!clk_dvfs_node) {
		PM_ERR("%s: clk(%s) get dvfs node error\n", __func__, clk_name);
		return n;
	}

	if (0 == strncmp(cmd, "set", strlen("set"))) {
		PM_DBG("Get command set %s %dHz\n", clk_name, rate);
		if (file_read(FILE_GOV_MODE, msg) != 0) {
			PM_ERR("read current governor error\n");
			return n;
		} else {
			PM_DBG("current governor = %s\n", msg);
		}

		strcpy(msg, "userspace");
		if (file_write(FILE_GOV_MODE, msg) != 0) {
			PM_ERR("set current governor error\n");
			return n;
		}

		dvfs_clk_enable_limit(clk_dvfs_node, rate, rate);
		dvfs_clk_set_rate(clk_dvfs_node, rate);

	} else if (0 == strncmp(cmd, "reset", strlen("reset"))) {	
		PM_DBG("Get command reset %s\n", clk_name);
		if (file_read(FILE_GOV_MODE, msg) != 0) {
			PM_ERR("read current governor error\n");
			return n;
		} else {
			PM_DBG("current governor = %s\n", msg);
		}

		strcpy(msg, "interactive");
		if (file_write(FILE_GOV_MODE, msg) != 0) {
			PM_ERR("set current governor error\n");
			return n;
		}

		dvfs_clk_disable_limit(clk_dvfs_node);
	}
	
	return n;
}
ssize_t clk_rate_store(struct kobject *kobj, struct kobj_attribute *attr,
		const char *buf, size_t n)
{
	struct dvfs_node *clk_dvfs_node = NULL;
	struct clk *clk;
	char cmd[20], clk_name[20];
	unsigned long rate=0;
	int ret=0;
		
	sscanf(buf, "%s %s %lu", cmd, clk_name, &rate);
	
	PM_DBG("%s: cmd(%s), clk_name(%s), rate(%lu)\n", __func__, cmd, clk_name, rate);

	if (!strncmp(cmd, "set", strlen("set"))) {
		clk_dvfs_node = clk_get_dvfs_node(clk_name);
		if (!clk_dvfs_node) {
			PM_ERR("%s: clk(%s) get dvfs node error\n", __func__, clk_name);
			return n;
		}
		
		if (!strncmp(clk_name, "clk_core", strlen("clk_core"))) {
			if (file_write(FILE_GOV_MODE, "userspace") != 0) {
				PM_ERR("%s: set current governor error\n", __func__);
				return n;
			}
		}

		ret = dvfs_clk_enable_limit(clk_dvfs_node, rate, rate);
	} else {
		clk = clk_get(NULL, clk_name);
		if (IS_ERR_OR_NULL(clk)) {
			PM_ERR("%s: get clk(%s) err(%ld)\n", 
				__func__, clk_name, PTR_ERR(clk));
			return n;
		}
		
		if (!strncmp(cmd, "rawset", strlen("rawset"))) {
			ret = clk_set_rate(clk, rate);
		} else if (!strncmp(cmd, "open", strlen("open"))) {
			ret = clk_prepare_enable(clk);
		} else if (!strncmp(cmd, "close", strlen("close"))) {	
			clk_disable_unprepare(clk);
		}
	}

	if (ret) {
		PM_ERR("%s: set rate err(%d)", __func__, ret);
	}
	return n;
}
static int mali_clock_init(struct device *dev)
{
	int ret;

	struct mali_platform_drv_data *drv_data = dev_get_drvdata(dev);

	drv_data->pd = devm_clk_get(dev, "pd_gpu");
	if (IS_ERR(drv_data->pd)) {
		ret = PTR_ERR(drv_data->pd);
		dev_err(dev, "get pd_clk failed, %d\n", ret);
		return ret;
	}

	ret = clk_prepare_enable(drv_data->pd);
	if (ret) {
		dev_err(dev, "prepare pd_clk failed, %d\n", ret);
		return ret;
	}

	drv_data->clk = clk_get_dvfs_node("clk_gpu");
	if (IS_ERR(drv_data->clk)) {
		ret = PTR_ERR(drv_data->clk);
		dev_err(dev, "prepare clk gpu failed, %d\n", ret);
		return ret;
	}

	ret = dvfs_clk_prepare_enable(drv_data->clk);
	if (ret) {
		dev_err(dev, "prepare clk failed, %d\n", ret);
		return ret;
	}

	drv_data->power_state = true;

	return 0;
}