clk: lochnagar: Use new parent_data approach to register clock parents
Subsystems (2)
Charles Keepax
maintainerPATCH v2 1/1 clk: lochnagar: Use new parent_data approach to register clock parents
Switch over to the more modern style of registering parents and simplify the code in the process.
---
Changes since v1:
- Add config structure used from of_device_id for version specific configuration
Regarding the globally unique names being the same as the DT names. There isn't really much intention that this driver would use globally unique names and I am only really populating them to avoid NULL pointer dereferences in the core. If there is something it would make more sense to populate in those fields I am happy to do so. However, the names for the clocks as used from DT are fairly specific and I am unclear what else I would put in that field.
Thanks,
Charles
drivers/clk/clk-lochnagar.c | 194 +++++++++++++++++++------------------------- 1 file changed, 82 insertions(+), 112 deletions(-)
drivers/clk/clk-lochnagar.c +82 -112
@@ -42,46 +42,45 @@ struct lochnagar_clk_priv {struct regmap *regmap;enum lochnagar_type type; -const char **parents; -unsigned int nparents; -struct lochnagar_clk lclks[LOCHNAGAR_NUM_CLOCKS ]; }; -static const char *const lochnagar1_clk_parents[] = { -"ln-none" , -"ln-spdif-mclk" , -"ln-psia1-mclk" , -"ln-psia2-mclk" , -"ln-cdc-clkout" , -"ln-dsp-clkout" , -"ln-pmic-32k" , -"ln-gf-mclk1" , -"ln-gf-mclk3" , -"ln-gf-mclk2" , -"ln-gf-mclk4" , +#define LN_PARENT (NAME ) { .name = NAME, .fw_name = NAME } + +static const struct clk_parent_data lochnagar1_clk_parents[] = { +LN_PARENT ("ln-none" ), +LN_PARENT ("ln-spdif-mclk" ), +LN_PARENT ("ln-psia1-mclk" ), +LN_PARENT ("ln-psia2-mclk" ), +LN_PARENT ("ln-cdc-clkout" ), +LN_PARENT ("ln-dsp-clkout" ), +LN_PARENT ("ln-pmic-32k" ), +LN_PARENT ("ln-gf-mclk1" ), +LN_PARENT ("ln-gf-mclk3" ), +LN_PARENT ("ln-gf-mclk2" ), +LN_PARENT ("ln-gf-mclk4" ), }; -static const char *const lochnagar2_clk_parents[] = { -"ln-none" , -"ln-cdc-clkout" , -"ln-dsp-clkout" , -"ln-pmic-32k" , -"ln-spdif-mclk" , -"ln-clk-12m" , -"ln-clk-11m" , -"ln-clk-24m" , -"ln-clk-22m" , -"ln-clk-8m" , -"ln-usb-clk-24m" , -"ln-gf-mclk1" , -"ln-gf-mclk3" , -"ln-gf-mclk2" , -"ln-psia1-mclk" , -"ln-psia2-mclk" , -"ln-spdif-clkout" , -"ln-adat-mclk" , -"ln-usb-clk-12m" , +static const struct clk_parent_data lochnagar2_clk_parents[] = { +LN_PARENT ("ln-none" ), +LN_PARENT ("ln-cdc-clkout" ), +LN_PARENT ("ln-dsp-clkout" ), +LN_PARENT ("ln-pmic-32k" ), +LN_PARENT ("ln-spdif-mclk" ), +LN_PARENT ("ln-clk-12m" ), +LN_PARENT ("ln-clk-11m" ), +LN_PARENT ("ln-clk-24m" ), +LN_PARENT ("ln-clk-22m" ), +LN_PARENT ("ln-clk-8m" ), +LN_PARENT ("ln-usb-clk-24m" ), +LN_PARENT ("ln-gf-mclk1" ), +LN_PARENT ("ln-gf-mclk3" ), +LN_PARENT ("ln-gf-mclk2" ), +LN_PARENT ("ln-psia1-mclk" ), +LN_PARENT ("ln-psia2-mclk" ), +LN_PARENT ("ln-spdif-clkout" ), +LN_PARENT ("ln-adat-mclk" ), +LN_PARENT ("ln-usb-clk-12m" ), };#define LN1_CLK (ID ,NAME ,REG ) \
@@ -122,6 +121,24 @@ static const struct lochnagar_clk lochnagar2_clks[LOCHNAGAR_NUM_CLOCKS] = { LN2_CLK(SOUNDCARD_MCLK, "ln-soundcard-mclk"), }; +struct lochnagar_config { +const struct clk_parent_data *parents; +int nparents; +const struct lochnagar_clk *clks; +}; + +static const struct lochnagar_config lochnagar1_conf = { + .parents = lochnagar1_clk_parents, + .nparents =ARRAY_SIZE (lochnagar1_clk_parents), + .clks = lochnagar1_clks, +}; + +static const struct lochnagar_config lochnagar2_conf = { + .parents = lochnagar2_clk_parents, + .nparents =ARRAY_SIZE (lochnagar2_clk_parents), + .clks = lochnagar2_clks, +}; +static inline struct lochnagar_clk *lochnagar_hw_to_lclk (struct clk_hw *hw) { return container_of(hw, struct lochnagar_clk, hw);
@@ -183,7 +200,7 @@ static u8 lochnagar_clk_get_parent(struct clk_hw *hw)if (ret <0 ) {dev_dbg (priv->dev,"Failed to read parent of %s: %d\n" , lclk->name, ret); -return priv->nparents; +return hw->init->num_parents; } val &= lclk->src_mask;
@@ -198,46 +215,6 @@ static const struct clk_ops lochnagar_clk_ops = { .get_parent = lochnagar_clk_get_parent, }; -static int lochnagar_init_parents (struct lochnagar_clk_priv *priv) -{ -struct device_node *np = priv->dev->of_node; -int i, j; - -switch (priv->type) { -case LOCHNAGAR1 : -memcpy (priv->lclks, lochnagar1_clks,sizeof (lochnagar1_clks)); - - priv->nparents =ARRAY_SIZE (lochnagar1_clk_parents); - priv->parents =devm_kmemdup (priv->dev, lochnagar1_clk_parents, -sizeof (lochnagar1_clk_parents), -GFP_KERNEL ); -break ; -case LOCHNAGAR2 : -memcpy (priv->lclks, lochnagar2_clks,sizeof (lochnagar2_clks)); - - priv->nparents =ARRAY_SIZE (lochnagar2_clk_parents); - priv->parents =devm_kmemdup (priv->dev, lochnagar2_clk_parents, -sizeof (lochnagar2_clk_parents), -GFP_KERNEL ); -break ; -default : -dev_err (priv->dev,"Unknown Lochnagar type: %d\n" , priv->type); -return -EINVAL ; - } - -if (!priv->parents) -return -ENOMEM ; - -for (i =0 ; i < priv->nparents; i++) { - j =of_property_match_string (np,"clock-names" , - priv->parents[i]); -if (j >=0 ) - priv->parents[i] =of_clk_get_parent_name (np, j); - } - -return 0 ; -} -static struct clk_hw *lochnagar_of_clk_hw_get (struct of_phandle_args *clkspec,void *data) {
@@ -252,16 +229,42 @@ lochnagar_of_clk_hw_get(struct of_phandle_args *clkspec, void *data)return &priv->lclks[idx].hw; } -static int lochnagar_init_clks (struct lochnagar_clk_priv *priv) +static const struct of_device_id lochnagar_of_match[] = { + { .compatible ="cirrus,lochnagar1-clk" , .data = &lochnagar1_conf }, + { .compatible ="cirrus,lochnagar2-clk" , .data = &lochnagar2_conf }, + {} +}; +MODULE_DEVICE_TABLE (of, lochnagar_of_match); + +static int lochnagar_clk_probe (struct platform_device *pdev) {struct clk_init_data clk_init = { .ops = &lochnagar_clk_ops, - .parent_names = priv->parents, - .num_parents = priv->nparents, }; +struct device *dev = &pdev->dev; +struct lochnagar_clk_priv *priv; +const struct of_device_id *of_id;struct lochnagar_clk *lclk; +struct lochnagar_config *conf;int ret, i; + of_id =of_match_device (lochnagar_of_match, dev); +if (!of_id) +return -EINVAL ; + + priv =devm_kzalloc (dev,sizeof (*priv),GFP_KERNEL ); +if (!priv) +return -ENOMEM ; + + priv->dev = dev; + priv->regmap =dev_get_regmap (dev->parent,NULL ); + conf = (struct lochnagar_config *)of_id->data; + +memcpy (priv->lclks, conf->clks,sizeof (priv->lclks)); + + clk_init.parent_data = conf->parents; + clk_init.num_parents = conf->nparents; +for (i =0 ; i <ARRAY_SIZE (priv->lclks); i++) { lclk = &priv->lclks[i];
@@ -289,39 +292,6 @@ static int lochnagar_init_clks(struct lochnagar_clk_priv *priv)return ret; } -static const struct of_device_id lochnagar_of_match[] = { - { .compatible ="cirrus,lochnagar1-clk" , .data = (void *)LOCHNAGAR1 }, - { .compatible ="cirrus,lochnagar2-clk" , .data = (void *)LOCHNAGAR2 }, - {} -}; -MODULE_DEVICE_TABLE (of, lochnagar_of_match); - -static int lochnagar_clk_probe (struct platform_device *pdev) -{ -struct device *dev = &pdev->dev; -struct lochnagar_clk_priv *priv; -const struct of_device_id *of_id; -int ret; - - of_id =of_match_device (lochnagar_of_match, dev); -if (!of_id) -return -EINVAL ; - - priv =devm_kzalloc (dev,sizeof (*priv),GFP_KERNEL ); -if (!priv) -return -ENOMEM ; - - priv->dev = dev; - priv->regmap =dev_get_regmap (dev->parent,NULL ); - priv->type = (enum lochnagar_type )of_id->data; - - ret =lochnagar_init_parents (priv); -if (ret) -return ret; - -return lochnagar_init_clks (priv); -} -static struct platform_driver lochnagar_clk_driver = { .driver = { .name ="lochnagar-clk" ,
Signature · 1 line
2.11.0
Charles Keepax
maintainerQuoted 31 lines · Charles Keepax
Switch over to the more modern style of registering parents and simplify the code in the process.
Suggested-by Stephen Boyd <[email protected]>Signed-off-by Charles Keepax <[email protected]>---
Changes since v1:
- Add config structure used fromof_device_idfor version specific configurationRegarding the globally unique names being the same as the DT names. There isn't really much intention that this driver would use globally unique names and I am only really populating them to avoid NULL pointer dereferences in the core. If there is something it would make more sense to populate in those fields I am happy to do so. However, the names for the clocks as used from DT are fairly specific and I am unclear what else I would put in that field.
Thanks,
Charlesdrivers/clk/clk-lochnagar.c | 194 +++++++++++++++++++------------------------- 1 file changed, 82 insertions(+), 112 deletions(-)drivers/clk/clk-lochnagar.c +0
-0
drivers/clk/clk-lochnagar.c struct lochnagar_clk_priv { · line 43
Quoted 2 lines
drivers/clk/clk-lochnagar.c +0
-0@@ -42,46 +42,45 @@ struct lochnagar_clk_priv {struct regmap *regmap;enum lochnagar_type type;
oops type should have gone here as well apologies will send a version 3.
Thanks,
Charles