|
@@ -55,6 +55,7 @@ struct clk_plt_data {
|
|
u8 nparents;
|
|
u8 nparents;
|
|
struct clk_plt *clks[PMC_CLK_NUM];
|
|
struct clk_plt *clks[PMC_CLK_NUM];
|
|
struct clk_lookup *mclk_lookup;
|
|
struct clk_lookup *mclk_lookup;
|
|
|
|
+ struct clk_lookup *ether_clk_lookup;
|
|
};
|
|
};
|
|
|
|
|
|
/* Return an index in parent table */
|
|
/* Return an index in parent table */
|
|
@@ -186,13 +187,6 @@ static struct clk_plt *plt_clk_register(struct platform_device *pdev, int id,
|
|
pclk->reg = base + PMC_CLK_CTL_OFFSET + id * PMC_CLK_CTL_SIZE;
|
|
pclk->reg = base + PMC_CLK_CTL_OFFSET + id * PMC_CLK_CTL_SIZE;
|
|
spin_lock_init(&pclk->lock);
|
|
spin_lock_init(&pclk->lock);
|
|
|
|
|
|
- /*
|
|
|
|
- * If the clock was already enabled by the firmware mark it as critical
|
|
|
|
- * to avoid it being gated by the clock framework if no driver owns it.
|
|
|
|
- */
|
|
|
|
- if (plt_clk_is_enabled(&pclk->hw))
|
|
|
|
- init.flags |= CLK_IS_CRITICAL;
|
|
|
|
-
|
|
|
|
ret = devm_clk_hw_register(&pdev->dev, &pclk->hw);
|
|
ret = devm_clk_hw_register(&pdev->dev, &pclk->hw);
|
|
if (ret) {
|
|
if (ret) {
|
|
pclk = ERR_PTR(ret);
|
|
pclk = ERR_PTR(ret);
|
|
@@ -351,11 +345,20 @@ static int plt_clk_probe(struct platform_device *pdev)
|
|
goto err_unreg_clk_plt;
|
|
goto err_unreg_clk_plt;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ data->ether_clk_lookup = clkdev_hw_create(&data->clks[4]->hw,
|
|
|
|
+ "ether_clk", NULL);
|
|
|
|
+ if (!data->ether_clk_lookup) {
|
|
|
|
+ err = -ENOMEM;
|
|
|
|
+ goto err_drop_mclk;
|
|
|
|
+ }
|
|
|
|
+
|
|
plt_clk_free_parent_names_loop(parent_names, data->nparents);
|
|
plt_clk_free_parent_names_loop(parent_names, data->nparents);
|
|
|
|
|
|
platform_set_drvdata(pdev, data);
|
|
platform_set_drvdata(pdev, data);
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
+err_drop_mclk:
|
|
|
|
+ clkdev_drop(data->mclk_lookup);
|
|
err_unreg_clk_plt:
|
|
err_unreg_clk_plt:
|
|
plt_clk_unregister_loop(data, i);
|
|
plt_clk_unregister_loop(data, i);
|
|
plt_clk_unregister_parents(data);
|
|
plt_clk_unregister_parents(data);
|
|
@@ -369,6 +372,7 @@ static int plt_clk_remove(struct platform_device *pdev)
|
|
|
|
|
|
data = platform_get_drvdata(pdev);
|
|
data = platform_get_drvdata(pdev);
|
|
|
|
|
|
|
|
+ clkdev_drop(data->ether_clk_lookup);
|
|
clkdev_drop(data->mclk_lookup);
|
|
clkdev_drop(data->mclk_lookup);
|
|
plt_clk_unregister_loop(data, PMC_CLK_NUM);
|
|
plt_clk_unregister_loop(data, PMC_CLK_NUM);
|
|
plt_clk_unregister_parents(data);
|
|
plt_clk_unregister_parents(data);
|