diff options
Diffstat (limited to 'drivers/clk/x86/clk-pmc-atom.c')
| -rw-r--r-- | drivers/clk/x86/clk-pmc-atom.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/drivers/clk/x86/clk-pmc-atom.c b/drivers/clk/x86/clk-pmc-atom.c index 08ef69945ffb..d977193842df 100644 --- a/drivers/clk/x86/clk-pmc-atom.c +++ b/drivers/clk/x86/clk-pmc-atom.c | |||
| @@ -55,6 +55,7 @@ struct clk_plt_data { | |||
| 55 | u8 nparents; | 55 | u8 nparents; |
| 56 | struct clk_plt *clks[PMC_CLK_NUM]; | 56 | struct clk_plt *clks[PMC_CLK_NUM]; |
| 57 | struct clk_lookup *mclk_lookup; | 57 | struct clk_lookup *mclk_lookup; |
| 58 | struct clk_lookup *ether_clk_lookup; | ||
| 58 | }; | 59 | }; |
| 59 | 60 | ||
| 60 | /* Return an index in parent table */ | 61 | /* Return an index in parent table */ |
| @@ -186,13 +187,6 @@ static struct clk_plt *plt_clk_register(struct platform_device *pdev, int id, | |||
| 186 | pclk->reg = base + PMC_CLK_CTL_OFFSET + id * PMC_CLK_CTL_SIZE; | 187 | pclk->reg = base + PMC_CLK_CTL_OFFSET + id * PMC_CLK_CTL_SIZE; |
| 187 | spin_lock_init(&pclk->lock); | 188 | spin_lock_init(&pclk->lock); |
| 188 | 189 | ||
| 189 | /* | ||
| 190 | * If the clock was already enabled by the firmware mark it as critical | ||
| 191 | * to avoid it being gated by the clock framework if no driver owns it. | ||
| 192 | */ | ||
| 193 | if (plt_clk_is_enabled(&pclk->hw)) | ||
| 194 | init.flags |= CLK_IS_CRITICAL; | ||
| 195 | |||
| 196 | ret = devm_clk_hw_register(&pdev->dev, &pclk->hw); | 190 | ret = devm_clk_hw_register(&pdev->dev, &pclk->hw); |
| 197 | if (ret) { | 191 | if (ret) { |
| 198 | pclk = ERR_PTR(ret); | 192 | pclk = ERR_PTR(ret); |
| @@ -351,11 +345,20 @@ static int plt_clk_probe(struct platform_device *pdev) | |||
| 351 | goto err_unreg_clk_plt; | 345 | goto err_unreg_clk_plt; |
| 352 | } | 346 | } |
| 353 | 347 | ||
| 348 | data->ether_clk_lookup = clkdev_hw_create(&data->clks[4]->hw, | ||
| 349 | "ether_clk", NULL); | ||
| 350 | if (!data->ether_clk_lookup) { | ||
| 351 | err = -ENOMEM; | ||
| 352 | goto err_drop_mclk; | ||
| 353 | } | ||
| 354 | |||
| 354 | plt_clk_free_parent_names_loop(parent_names, data->nparents); | 355 | plt_clk_free_parent_names_loop(parent_names, data->nparents); |
| 355 | 356 | ||
| 356 | platform_set_drvdata(pdev, data); | 357 | platform_set_drvdata(pdev, data); |
| 357 | return 0; | 358 | return 0; |
| 358 | 359 | ||
| 360 | err_drop_mclk: | ||
| 361 | clkdev_drop(data->mclk_lookup); | ||
| 359 | err_unreg_clk_plt: | 362 | err_unreg_clk_plt: |
| 360 | plt_clk_unregister_loop(data, i); | 363 | plt_clk_unregister_loop(data, i); |
| 361 | plt_clk_unregister_parents(data); | 364 | plt_clk_unregister_parents(data); |
| @@ -369,6 +372,7 @@ static int plt_clk_remove(struct platform_device *pdev) | |||
| 369 | 372 | ||
| 370 | data = platform_get_drvdata(pdev); | 373 | data = platform_get_drvdata(pdev); |
| 371 | 374 | ||
| 375 | clkdev_drop(data->ether_clk_lookup); | ||
| 372 | clkdev_drop(data->mclk_lookup); | 376 | clkdev_drop(data->mclk_lookup); |
| 373 | plt_clk_unregister_loop(data, PMC_CLK_NUM); | 377 | plt_clk_unregister_loop(data, PMC_CLK_NUM); |
| 374 | plt_clk_unregister_parents(data); | 378 | plt_clk_unregister_parents(data); |
