diff options
Diffstat (limited to 'drivers')
| -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 | } |
