Commit 8e54eea5 authored by Jordan Crouse's avatar Jordan Crouse Committed by Rob Clark

drm/msm: Add a helper function to parse clock names

Add a helper function to parse the clock names and set up
the bulk data so we can take advantage of the bulk clock
functions instead of rolling our own. This is added
as a helper function so the upcoming a6xx GMU code can
also take advantage of it.
Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
parent 77a209cd
...@@ -81,6 +81,63 @@ module_param(modeset, bool, 0600); ...@@ -81,6 +81,63 @@ module_param(modeset, bool, 0600);
* Util/helpers: * Util/helpers:
*/ */
int msm_clk_bulk_get(struct device *dev, struct clk_bulk_data **bulk)
{
struct property *prop;
const char *name;
struct clk_bulk_data *local;
int i = 0, ret, count;
count = of_property_count_strings(dev->of_node, "clock-names");
if (count < 1)
return 0;
local = devm_kcalloc(dev, sizeof(struct clk_bulk_data *),
count, GFP_KERNEL);
if (!local)
return -ENOMEM;
of_property_for_each_string(dev->of_node, "clock-names", prop, name) {
local[i].id = devm_kstrdup(dev, name, GFP_KERNEL);
if (!local[i].id) {
devm_kfree(dev, local);
return -ENOMEM;
}
i++;
}
ret = devm_clk_bulk_get(dev, count, local);
if (ret) {
for (i = 0; i < count; i++)
devm_kfree(dev, (void *) local[i].id);
devm_kfree(dev, local);
return ret;
}
*bulk = local;
return count;
}
struct clk *msm_clk_bulk_get_clock(struct clk_bulk_data *bulk, int count,
const char *name)
{
int i;
char n[32];
snprintf(n, sizeof(n), "%s_clk", name);
for (i = 0; bulk && i < count; i++) {
if (!strcmp(bulk[i].id, name) || !strcmp(bulk[i].id, n))
return bulk[i].clk;
}
return NULL;
}
struct clk *msm_clk_get(struct platform_device *pdev, const char *name) struct clk *msm_clk_get(struct platform_device *pdev, const char *name)
{ {
struct clk *clk; struct clk *clk;
......
...@@ -387,6 +387,10 @@ static inline void msm_perf_debugfs_cleanup(struct msm_drm_private *priv) {} ...@@ -387,6 +387,10 @@ static inline void msm_perf_debugfs_cleanup(struct msm_drm_private *priv) {}
#endif #endif
struct clk *msm_clk_get(struct platform_device *pdev, const char *name); struct clk *msm_clk_get(struct platform_device *pdev, const char *name);
int msm_clk_bulk_get(struct device *dev, struct clk_bulk_data **bulk);
struct clk *msm_clk_bulk_get_clock(struct clk_bulk_data *bulk, int count,
const char *name);
void __iomem *msm_ioremap(struct platform_device *pdev, const char *name, void __iomem *msm_ioremap(struct platform_device *pdev, const char *name,
const char *dbgname); const char *dbgname);
void msm_writel(u32 data, void __iomem *addr); void msm_writel(u32 data, void __iomem *addr);
......
...@@ -142,8 +142,6 @@ static int disable_pwrrail(struct msm_gpu *gpu) ...@@ -142,8 +142,6 @@ static int disable_pwrrail(struct msm_gpu *gpu)
static int enable_clk(struct msm_gpu *gpu) static int enable_clk(struct msm_gpu *gpu)
{ {
int i;
if (gpu->core_clk && gpu->fast_rate) if (gpu->core_clk && gpu->fast_rate)
clk_set_rate(gpu->core_clk, gpu->fast_rate); clk_set_rate(gpu->core_clk, gpu->fast_rate);
...@@ -151,28 +149,12 @@ static int enable_clk(struct msm_gpu *gpu) ...@@ -151,28 +149,12 @@ static int enable_clk(struct msm_gpu *gpu)
if (gpu->rbbmtimer_clk) if (gpu->rbbmtimer_clk)
clk_set_rate(gpu->rbbmtimer_clk, 19200000); clk_set_rate(gpu->rbbmtimer_clk, 19200000);
for (i = gpu->nr_clocks - 1; i >= 0; i--) return clk_bulk_prepare_enable(gpu->nr_clocks, gpu->grp_clks);
if (gpu->grp_clks[i])
clk_prepare(gpu->grp_clks[i]);
for (i = gpu->nr_clocks - 1; i >= 0; i--)
if (gpu->grp_clks[i])
clk_enable(gpu->grp_clks[i]);
return 0;
} }
static int disable_clk(struct msm_gpu *gpu) static int disable_clk(struct msm_gpu *gpu)
{ {
int i; clk_bulk_disable_unprepare(gpu->nr_clocks, gpu->grp_clks);
for (i = gpu->nr_clocks - 1; i >= 0; i--)
if (gpu->grp_clks[i])
clk_disable(gpu->grp_clks[i]);
for (i = gpu->nr_clocks - 1; i >= 0; i--)
if (gpu->grp_clks[i])
clk_unprepare(gpu->grp_clks[i]);
/* /*
* Set the clock to a deliberately low rate. On older targets the clock * Set the clock to a deliberately low rate. On older targets the clock
...@@ -785,44 +767,22 @@ static irqreturn_t irq_handler(int irq, void *data) ...@@ -785,44 +767,22 @@ static irqreturn_t irq_handler(int irq, void *data)
return gpu->funcs->irq(gpu); return gpu->funcs->irq(gpu);
} }
static struct clk *get_clock(struct device *dev, const char *name)
{
struct clk *clk = devm_clk_get(dev, name);
return IS_ERR(clk) ? NULL : clk;
}
static int get_clocks(struct platform_device *pdev, struct msm_gpu *gpu) static int get_clocks(struct platform_device *pdev, struct msm_gpu *gpu)
{ {
struct device *dev = &pdev->dev; int ret = msm_clk_bulk_get(&pdev->dev, &gpu->grp_clks);
struct property *prop;
const char *name;
int i = 0;
gpu->nr_clocks = of_property_count_strings(dev->of_node, "clock-names"); if (ret < 1) {
if (gpu->nr_clocks < 1) {
gpu->nr_clocks = 0; gpu->nr_clocks = 0;
return 0; return ret;
}
gpu->grp_clks = devm_kcalloc(dev, sizeof(struct clk *), gpu->nr_clocks,
GFP_KERNEL);
if (!gpu->grp_clks) {
gpu->nr_clocks = 0;
return -ENOMEM;
} }
of_property_for_each_string(dev->of_node, "clock-names", prop, name) { gpu->nr_clocks = ret;
gpu->grp_clks[i] = get_clock(dev, name);
/* Remember the key clocks that we need to control later */ gpu->core_clk = msm_clk_bulk_get_clock(gpu->grp_clks,
if (!strcmp(name, "core") || !strcmp(name, "core_clk")) gpu->nr_clocks, "core");
gpu->core_clk = gpu->grp_clks[i];
else if (!strcmp(name, "rbbmtimer") || !strcmp(name, "rbbmtimer_clk"))
gpu->rbbmtimer_clk = gpu->grp_clks[i];
++i; gpu->rbbmtimer_clk = msm_clk_bulk_get_clock(gpu->grp_clks,
} gpu->nr_clocks, "rbbmtimer");
return 0; return 0;
} }
......
...@@ -112,7 +112,7 @@ struct msm_gpu { ...@@ -112,7 +112,7 @@ struct msm_gpu {
/* Power Control: */ /* Power Control: */
struct regulator *gpu_reg, *gpu_cx; struct regulator *gpu_reg, *gpu_cx;
struct clk **grp_clks; struct clk_bulk_data *grp_clks;
int nr_clocks; int nr_clocks;
struct clk *ebi1_clk, *core_clk, *rbbmtimer_clk; struct clk *ebi1_clk, *core_clk, *rbbmtimer_clk;
uint32_t fast_rate; uint32_t fast_rate;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment