msm: qdss: migrate to use standard clk apis for qdss clk
Clock driver now provides support for qdss clocks and so switch to use
the standard clk apis.
Change-Id: Ie621786a8b85376ea25ae8ce10337b27dc6a7ad0
Signed-off-by: Pratik Patel <pratikp@codeaurora.org>
diff --git a/arch/arm/mach-msm/qdss.c b/arch/arm/mach-msm/qdss.c
index 83a6a36..a7e8b85 100644
--- a/arch/arm/mach-msm/qdss.c
+++ b/arch/arm/mach-msm/qdss.c
@@ -19,9 +19,8 @@
#include <linux/io.h>
#include <linux/err.h>
#include <linux/export.h>
-#include <mach/rpm.h>
+#include <linux/clk.h>
-#include "rpm_resources.h"
#include "qdss-priv.h"
#define MAX_STR_LEN (65535)
@@ -47,8 +46,7 @@
uint8_t sink_count; /* I: sink count */
struct mutex sink_mutex;
uint8_t max_clk;
- uint8_t clk_count; /* C: clk count */
- struct mutex clk_mutex;
+ struct clk *clk;
};
static struct qdss_ctx qdss;
@@ -197,66 +195,31 @@
/**
* qdss_clk_enable - enable qdss clocks
*
- * Enables qdss clocks via RPM if they aren't already enabled, otherwise
- * increments the reference count.
+ * Enables qdss clocks
*
* CONTEXT:
- * Might sleep. Uses a mutex lock. Should be called from a non-atomic context.
+ * Might sleep. Should be called from a non-atomic context.
*
* RETURNS:
* 0 on success, non-zero on failure
*/
int qdss_clk_enable(void)
{
- int ret;
- struct msm_rpm_iv_pair iv;
-
- mutex_lock(&qdss.clk_mutex);
- if (qdss.clk_count == 0) {
- iv.id = MSM_RPM_ID_QDSS_CLK;
- if (qdss.max_clk)
- iv.value = QDSS_CLK_ON_HSDBG;
- else
- iv.value = QDSS_CLK_ON_DBG;
- ret = msm_rpmrs_set(MSM_RPM_CTX_SET_0, &iv, 1);
- if (WARN(ret, "qdss clks not enabled (%d)\n", ret))
- goto err_clk;
- }
- qdss.clk_count++;
- mutex_unlock(&qdss.clk_mutex);
- return 0;
-err_clk:
- mutex_unlock(&qdss.clk_mutex);
- return ret;
+ return clk_prepare_enable(qdss.clk);
}
EXPORT_SYMBOL(qdss_clk_enable);
/**
* qdss_clk_disable - disable qdss clocks
*
- * Disables qdss clocks via RPM if the reference count is one, otherwise
- * decrements the reference count.
+ * Disables qdss clocks
*
* CONTEXT:
- * Might sleep. Uses a mutex lock. Should be called from a non-atomic context.
+ * Might sleep. Should be called from a non-atomic context.
*/
void qdss_clk_disable(void)
{
- int ret;
- struct msm_rpm_iv_pair iv;
-
- mutex_lock(&qdss.clk_mutex);
- if (WARN(qdss.clk_count == 0, "qdss clks are unbalanced\n"))
- goto out;
- if (qdss.clk_count == 1) {
- iv.id = MSM_RPM_ID_QDSS_CLK;
- iv.value = QDSS_CLK_OFF;
- ret = msm_rpmrs_set(MSM_RPM_CTX_SET_0, &iv, 1);
- WARN(ret, "qdss clks not disabled (%d)\n", ret);
- }
- qdss.clk_count--;
-out:
- mutex_unlock(&qdss.clk_mutex);
+ clk_disable_unprepare(qdss.clk);
}
EXPORT_SYMBOL(qdss_clk_disable);
@@ -329,11 +292,10 @@
static int __devinit qdss_probe(struct platform_device *pdev)
{
- int ret;
+ int ret = 0;
struct msm_qdss_platform_data *pdata;
mutex_init(&qdss.sources_mutex);
- mutex_init(&qdss.clk_mutex);
mutex_init(&qdss.sink_mutex);
INIT_LIST_HEAD(&qdss.sources);
@@ -342,14 +304,29 @@
if (!pdata)
goto err_pdata;
+ qdss.clk = clk_get(&pdev->dev, "core_clk");
+ if (IS_ERR(qdss.clk)) {
+ ret = PTR_ERR(qdss.clk);
+ pr_info("clk get failed\n");
+ goto err_clk_get;
+ }
+
+ ret = clk_set_rate(qdss.clk, QDSS_CLK_ON_DBG);
+ if (ret) {
+ pr_info("clk rate failed\n");
+ goto err_clk_rate;
+ }
+
qdss.afamily = pdata->afamily;
qdss_add_sources(pdata->src_table, pdata->size);
pr_info("QDSS arch initialized\n");
return 0;
+err_clk_rate:
+ clk_put(qdss.clk);
+err_clk_get:
err_pdata:
mutex_destroy(&qdss.sink_mutex);
- mutex_destroy(&qdss.clk_mutex);
mutex_destroy(&qdss.sources_mutex);
pr_err("QDSS init failed\n");
return ret;
@@ -358,8 +335,8 @@
static int __devexit qdss_remove(struct platform_device *pdev)
{
qdss_sysfs_exit();
+ clk_put(qdss.clk);
mutex_destroy(&qdss.sink_mutex);
- mutex_destroy(&qdss.clk_mutex);
mutex_destroy(&qdss.sources_mutex);
return 0;