@@ -5,6 +5,7 @@
#include <linux/atomic.h>
#include <linux/bt-bmc.h>
+#include <linux/clk.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/io.h>
@@ -62,6 +63,7 @@ struct bt_bmc {
wait_queue_head_t queue;
struct timer_list poll_timer;
struct mutex mutex;
+ struct clk *clk;
};
static atomic_t open_count = ATOMIC_INIT(0);
@@ -423,6 +425,16 @@ static int bt_bmc_probe(struct platform_device *pdev)
if (IS_ERR(bt_bmc->base))
return PTR_ERR(bt_bmc->base);
+ bt_bmc->clk = devm_clk_get(dev, NULL);
+ if (IS_ERR(bt_bmc->clk))
+ return dev_err_probe(dev, PTR_ERR(bt_bmc->clk),
+ "Unable to get clock\n");
+ rc = clk_prepare_enable(bt_bmc->clk);
+ if (rc) {
+ dev_err(dev, "Unable to enable clock\n");
+ return rc;
+ }
+
mutex_init(&bt_bmc->mutex);
init_waitqueue_head(&bt_bmc->queue);
@@ -433,7 +445,7 @@ static int bt_bmc_probe(struct platform_device *pdev)
rc = misc_register(&bt_bmc->miscdev);
if (rc) {
dev_err(dev, "Unable to register misc device\n");
- return rc;
+ goto err;
}
bt_bmc_config_irq(bt_bmc, pdev);
@@ -457,6 +469,11 @@ static int bt_bmc_probe(struct platform_device *pdev)
clr_b_busy(bt_bmc);
return 0;
+
+err:
+ clk_disable_unprepare(bt_bmc->clk);
+
+ return rc;
}
static int bt_bmc_remove(struct platform_device *pdev)
@@ -466,6 +483,8 @@ static int bt_bmc_remove(struct platform_device *pdev)
misc_deregister(&bt_bmc->miscdev);
if (bt_bmc->irq < 0)
del_timer_sync(&bt_bmc->poll_timer);
+ clk_disable_unprepare(bt_bmc->clk);
+
return 0;
}