diff options
author | Joel Stanley <joel@jms.id.au> | 2018-02-19 02:24:21 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-03-15 13:20:51 -0400 |
commit | 99aad9e3a9d28c1b998cb157c85e17db957e8ae5 (patch) | |
tree | 6aa240eaeb73681b1adb33ba48d50ae4cf8117d0 /drivers/misc/aspeed-lpc-ctrl.c | |
parent | eb105eace9521063c2b8786e09879043ec643d26 (diff) |
misc: aspeed-lpc: Request and enable LPC clock
The LPC device needs to ensure it's clock is enabled before it can do
anything.
In the past the clock was enabled and left running by u-boot, however
Linux now has an upstream clock driver that disables unused clocks.
Tested-by: Lei YU <mine260309@gmail.com>
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
Signed-off-by: Joel Stanley <joel@jms.id.au>
Reviewed-by: Cyril Bur <cyrilbur@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/misc/aspeed-lpc-ctrl.c')
-rw-r--r-- | drivers/misc/aspeed-lpc-ctrl.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/drivers/misc/aspeed-lpc-ctrl.c b/drivers/misc/aspeed-lpc-ctrl.c index b5439643f54b..1827b7aa6674 100644 --- a/drivers/misc/aspeed-lpc-ctrl.c +++ b/drivers/misc/aspeed-lpc-ctrl.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * 2 of the License, or (at your option) any later version. | 7 | * 2 of the License, or (at your option) any later version. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/clk.h> | ||
10 | #include <linux/mfd/syscon.h> | 11 | #include <linux/mfd/syscon.h> |
11 | #include <linux/miscdevice.h> | 12 | #include <linux/miscdevice.h> |
12 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
@@ -26,6 +27,7 @@ | |||
26 | struct aspeed_lpc_ctrl { | 27 | struct aspeed_lpc_ctrl { |
27 | struct miscdevice miscdev; | 28 | struct miscdevice miscdev; |
28 | struct regmap *regmap; | 29 | struct regmap *regmap; |
30 | struct clk *clk; | ||
29 | phys_addr_t mem_base; | 31 | phys_addr_t mem_base; |
30 | resource_size_t mem_size; | 32 | resource_size_t mem_size; |
31 | u32 pnor_size; | 33 | u32 pnor_size; |
@@ -221,16 +223,33 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev) | |||
221 | return -ENODEV; | 223 | return -ENODEV; |
222 | } | 224 | } |
223 | 225 | ||
226 | lpc_ctrl->clk = devm_clk_get(dev, NULL); | ||
227 | if (IS_ERR(lpc_ctrl->clk)) { | ||
228 | dev_err(dev, "couldn't get clock\n"); | ||
229 | return PTR_ERR(lpc_ctrl->clk); | ||
230 | } | ||
231 | rc = clk_prepare_enable(lpc_ctrl->clk); | ||
232 | if (rc) { | ||
233 | dev_err(dev, "couldn't enable clock\n"); | ||
234 | return rc; | ||
235 | } | ||
236 | |||
224 | lpc_ctrl->miscdev.minor = MISC_DYNAMIC_MINOR; | 237 | lpc_ctrl->miscdev.minor = MISC_DYNAMIC_MINOR; |
225 | lpc_ctrl->miscdev.name = DEVICE_NAME; | 238 | lpc_ctrl->miscdev.name = DEVICE_NAME; |
226 | lpc_ctrl->miscdev.fops = &aspeed_lpc_ctrl_fops; | 239 | lpc_ctrl->miscdev.fops = &aspeed_lpc_ctrl_fops; |
227 | lpc_ctrl->miscdev.parent = dev; | 240 | lpc_ctrl->miscdev.parent = dev; |
228 | rc = misc_register(&lpc_ctrl->miscdev); | 241 | rc = misc_register(&lpc_ctrl->miscdev); |
229 | if (rc) | 242 | if (rc) { |
230 | dev_err(dev, "Unable to register device\n"); | 243 | dev_err(dev, "Unable to register device\n"); |
231 | else | 244 | goto err; |
232 | dev_info(dev, "Loaded at %pr\n", &resm); | 245 | } |
246 | |||
247 | dev_info(dev, "Loaded at %pr\n", &resm); | ||
248 | |||
249 | return 0; | ||
233 | 250 | ||
251 | err: | ||
252 | clk_disable_unprepare(lpc_ctrl->clk); | ||
234 | return rc; | 253 | return rc; |
235 | } | 254 | } |
236 | 255 | ||
@@ -239,6 +258,7 @@ static int aspeed_lpc_ctrl_remove(struct platform_device *pdev) | |||
239 | struct aspeed_lpc_ctrl *lpc_ctrl = dev_get_drvdata(&pdev->dev); | 258 | struct aspeed_lpc_ctrl *lpc_ctrl = dev_get_drvdata(&pdev->dev); |
240 | 259 | ||
241 | misc_deregister(&lpc_ctrl->miscdev); | 260 | misc_deregister(&lpc_ctrl->miscdev); |
261 | clk_disable_unprepare(lpc_ctrl->clk); | ||
242 | 262 | ||
243 | return 0; | 263 | return 0; |
244 | } | 264 | } |