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; }