|
@@ -47,6 +47,50 @@ int of_at91_get_clk_range(struct device_node *np, const char *propname,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(of_at91_get_clk_range);
|
|
|
|
|
|
+void pmc_data_free(struct pmc_data *pmc_data)
|
|
|
+{
|
|
|
+ kfree(pmc_data->chws);
|
|
|
+ kfree(pmc_data->shws);
|
|
|
+ kfree(pmc_data->phws);
|
|
|
+ kfree(pmc_data->ghws);
|
|
|
+}
|
|
|
+
|
|
|
+struct pmc_data *pmc_data_allocate(unsigned int ncore, unsigned int nsystem,
|
|
|
+ unsigned int nperiph, unsigned int ngck)
|
|
|
+{
|
|
|
+ struct pmc_data *pmc_data = kzalloc(sizeof(*pmc_data), GFP_KERNEL);
|
|
|
+
|
|
|
+ if (!pmc_data)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ pmc_data->ncore = ncore;
|
|
|
+ pmc_data->chws = kcalloc(ncore, sizeof(struct clk_hw *), GFP_KERNEL);
|
|
|
+ if (!pmc_data->chws)
|
|
|
+ goto err;
|
|
|
+
|
|
|
+ pmc_data->nsystem = nsystem;
|
|
|
+ pmc_data->shws = kcalloc(nsystem, sizeof(struct clk_hw *), GFP_KERNEL);
|
|
|
+ if (!pmc_data->shws)
|
|
|
+ goto err;
|
|
|
+
|
|
|
+ pmc_data->nperiph = nperiph;
|
|
|
+ pmc_data->phws = kcalloc(nperiph, sizeof(struct clk_hw *), GFP_KERNEL);
|
|
|
+ if (!pmc_data->phws)
|
|
|
+ goto err;
|
|
|
+
|
|
|
+ pmc_data->ngck = ngck;
|
|
|
+ pmc_data->ghws = kcalloc(ngck, sizeof(struct clk_hw *), GFP_KERNEL);
|
|
|
+ if (!pmc_data->ghws)
|
|
|
+ goto err;
|
|
|
+
|
|
|
+ return pmc_data;
|
|
|
+
|
|
|
+err:
|
|
|
+ pmc_data_free(pmc_data);
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_PM
|
|
|
static struct regmap *pmcreg;
|
|
|
|