summaryrefslogtreecommitdiffstats
path: root/drivers/misc/aspeed-lpc-ctrl.c
diff options
context:
space:
mode:
authorJoel Stanley <joel@jms.id.au>2018-02-19 02:24:21 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-03-15 13:20:51 -0400
commit99aad9e3a9d28c1b998cb157c85e17db957e8ae5 (patch)
tree6aa240eaeb73681b1adb33ba48d50ae4cf8117d0 /drivers/misc/aspeed-lpc-ctrl.c
parenteb105eace9521063c2b8786e09879043ec643d26 (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.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}