Commit b1e3454d authored by Hans de Goede's avatar Hans de Goede Committed by David S. Miller

clk: x86: add "ether_clk" alias for Bay Trail / Cherry Trail

Commit d31fd43c ("clk: x86: Do not gate clocks enabled by the
firmware") causes all unclaimed PMC clocks on Cherry Trail devices to be on
all the time, resulting on the device not being able to reach S0i2 or S0i3
when suspended.

The reason for this commit is that on some Bay Trail / Cherry Trail devices
the ethernet controller uses pmc_plt_clk_4. This commit adds an "ether_clk"
alias, so that the relevant ethernet drivers can try to (optionally) use
this, without needing X86 specific code / hacks, thus fixing ethernet on
these devices without breaking S0i3 support.

This commit uses clkdev_hw_create() to create the alias, mirroring the code
for the already existing "mclk" alias for pmc_plt_clk_3.

Buglink: https://bugzilla.kernel.org/show_bug.cgi?id=193891#c102
Buglink: https://bugzilla.kernel.org/show_bug.cgi?id=196861
Cc: Johannes Stezenbach <js@sig21.net>
Cc: Carlo Caione <carlo@endlessm.com>
Reported-by: default avatarJohannes Stezenbach <js@sig21.net>
Acked-by: default avatarStephen Boyd <sboyd@kernel.org>
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0866cd15
...@@ -55,6 +55,7 @@ struct clk_plt_data { ...@@ -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 */
...@@ -351,11 +352,20 @@ static int plt_clk_probe(struct platform_device *pdev) ...@@ -351,11 +352,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 +379,7 @@ static int plt_clk_remove(struct platform_device *pdev) ...@@ -369,6 +379,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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment