summaryrefslogtreecommitdiffstats
path: root/drivers/misc/aspeed-lpc-ctrl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/aspeed-lpc-ctrl.c')
-rw-r--r--drivers/misc/aspeed-lpc-ctrl.c26
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 @@
26struct aspeed_lpc_ctrl { 27struct 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
251err:
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}