Forráskód Böngészése

msm_mmrm: Added debug support for multiple register calls of same client

Added support to allow multiple register of same client so that mmrm
test app can be used after device is booted up.
This will also allow to test multiple concurrencies as well as
throttling feature.

Depends-on: 3630372
Change-Id: I19a2838f536d36db0629d9d64c962aba57c92d28
mbao 4 éve
szülő
commit
3a6373a550

+ 1 - 0
driver/src/mmrm_clk_rsrc_mgr.h

@@ -58,6 +58,7 @@ struct mmrm_sw_clk_client_tbl_entry {
 	u64 clk_rate;
 	u32 vdd_level;
 	bool reserve;
+	u32 ref_count;
 };
 
 struct mmrm_sw_peak_current_data {

+ 26 - 8
driver/src/mmrm_clk_rsrc_mgr_sw.c

@@ -188,6 +188,14 @@ static struct mmrm_client *mmrm_sw_clk_client_register(
 
 	/* entry already registered */
 	if (tbl_entry->client) {
+		if (msm_mmrm_allow_multiple_register) {
+			tbl_entry->ref_count++;
+			d_mpr_h("%s: client csid(%d) already registered ref:%d\n",
+				__func__, tbl_entry->clk_src_id, tbl_entry->ref_count);
+			clk_client = tbl_entry->client;
+			goto exit_found;
+		}
+
 		d_mpr_e("%s: client csid(%d) already registered\n",
 			__func__, tbl_entry->clk_src_id);
 		rc = -EINVAL;
@@ -205,6 +213,7 @@ static struct mmrm_client *mmrm_sw_clk_client_register(
 
 	clk_client->client_uid = c;
 	clk_client->client_type = MMRM_CLIENT_CLOCK;
+	tbl_entry->ref_count = 1;
 
 	/* copy the entries provided by client */
 	tbl_entry->client = clk_client;
@@ -239,15 +248,20 @@ static struct mmrm_client *mmrm_sw_clk_client_register(
 		goto err_fail_update_entry;
 	}
 
+exit_found:
 	mutex_unlock(&sw_clk_mgr->lock);
 
 	d_mpr_h("%s: exiting with success\n", __func__);
 	return clk_client;
 
 err_fail_update_entry:
+	kfree(clk_client);
+
 err_fail_alloc_clk_client:
-err_already_registered:
+	memset(tbl_entry, 0x0, sizeof(struct mmrm_sw_clk_client_tbl_entry));
+
 err_nofree_entry:
+err_already_registered:
 	mutex_unlock(&sw_clk_mgr->lock);
 
 	d_mpr_h("%s: error exit\n", __func__);
@@ -280,12 +294,16 @@ static int mmrm_sw_clk_client_deregister(struct mmrm_clk_mgr *sw_clk_mgr,
 	mutex_lock(&sw_clk_mgr->lock);
 
 	tbl_entry = &sinfo->clk_client_tbl[client->client_uid];
-	kfree(tbl_entry->client);
-	tbl_entry->client = NULL;
-	tbl_entry->clk = NULL;
-	tbl_entry->pri = 0x0;
-	tbl_entry->pvt_data = NULL;
-	tbl_entry->notifier_cb_fn = NULL;
+	if (tbl_entry->ref_count > 0) {
+		tbl_entry->ref_count--;
+	}
+
+	if (tbl_entry->ref_count == 0) {
+
+		kfree(tbl_entry->client);
+
+		memset(tbl_entry, 0x0, sizeof(struct mmrm_sw_clk_client_tbl_entry));
+	}
 
 	mutex_unlock(&sw_clk_mgr->lock);
 
@@ -319,7 +337,7 @@ static int mmrm_sw_get_req_level(
 
 	/* voltage corner is below svsl1 */
 	if (voltage_corner < mmrm_sw_vdd_corner[MMRM_VDD_LEVEL_SVS_L1]) {
-		d_mpr_w("%s: csid(%d): lower voltage corner(%d)\n",
+		d_mpr_h("%s: csid(%d): lower voltage corner(%d)\n",
 			__func__,
 			tbl_entry->clk_src_id,
 			voltage_corner);

+ 2 - 0
driver/src/mmrm_debug.c

@@ -8,6 +8,7 @@
 #include "mmrm_debug.h"
 
 int msm_mmrm_debug = MMRM_ERR | MMRM_WARN | MMRM_PRINTK;
+u8 msm_mmrm_allow_multiple_register = 0;
 
 #define MAX_DBG_BUF_SIZE 4096
 
@@ -59,6 +60,7 @@ struct dentry *msm_mmrm_debugfs_init(void)
 
 	/* add other params here */
 	debugfs_create_u32("debug_level", 0644, dir, &msm_mmrm_debug);
+	debugfs_create_u8("allow_multiple_register", 0644, dir, &msm_mmrm_allow_multiple_register);
 
 	d_mpr_h("%s: exiting\n", __func__);
 	return dir;

+ 1 - 0
driver/src/mmrm_debug.h

@@ -28,6 +28,7 @@ enum mmrm_msg_prio {
 };
 
 extern int msm_mmrm_debug;
+extern u8 msm_mmrm_allow_multiple_register;
 
 #define dprintk(__level, __fmt, ...) \
 	do { \