Loading drivers/clk/at91/pmc.c +44 −0 Original line number Diff line number Diff line Loading @@ -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; Loading drivers/clk/at91/pmc.h +17 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,17 @@ extern spinlock_t pmc_pcr_lock; struct pmc_data { unsigned int ncore; struct clk_hw **chws; unsigned int nsystem; struct clk_hw **shws; unsigned int nperiph; struct clk_hw **phws; unsigned int ngck; struct clk_hw **ghws; }; struct clk_range { unsigned long min; unsigned long max; Loading Loading @@ -69,6 +80,12 @@ extern const struct clk_programmable_layout at91rm9200_programmable_layout; extern const struct clk_programmable_layout at91sam9g45_programmable_layout; extern const struct clk_programmable_layout at91sam9x5_programmable_layout; #define ndck(a, s) (a[s - 1].id + 1) #define nck(a) (a[ARRAY_SIZE(a) - 1].id + 1) struct pmc_data *pmc_data_allocate(unsigned int ncore, unsigned int nsystem, unsigned int nperiph, unsigned int ngck); void pmc_data_free(struct pmc_data *pmc_data); int of_at91_get_clk_range(struct device_node *np, const char *propname, struct clk_range *range); Loading Loading
drivers/clk/at91/pmc.c +44 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
drivers/clk/at91/pmc.h +17 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,17 @@ extern spinlock_t pmc_pcr_lock; struct pmc_data { unsigned int ncore; struct clk_hw **chws; unsigned int nsystem; struct clk_hw **shws; unsigned int nperiph; struct clk_hw **phws; unsigned int ngck; struct clk_hw **ghws; }; struct clk_range { unsigned long min; unsigned long max; Loading Loading @@ -69,6 +80,12 @@ extern const struct clk_programmable_layout at91rm9200_programmable_layout; extern const struct clk_programmable_layout at91sam9g45_programmable_layout; extern const struct clk_programmable_layout at91sam9x5_programmable_layout; #define ndck(a, s) (a[s - 1].id + 1) #define nck(a) (a[ARRAY_SIZE(a) - 1].id + 1) struct pmc_data *pmc_data_allocate(unsigned int ncore, unsigned int nsystem, unsigned int nperiph, unsigned int ngck); void pmc_data_free(struct pmc_data *pmc_data); int of_at91_get_clk_range(struct device_node *np, const char *propname, struct clk_range *range); Loading