diff options
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 | } |