소스 검색

msm-mmrm: check if mmrm driver has initialized properly, avoid bootup crashes

Change-Id: I973a52eca4ee4ce8283d0ad1b6576ec7f527d037
mbao 4 년 전
부모
커밋
0b89bee6d0
1개의 변경된 파일34개의 추가작업 그리고 9개의 파일을 삭제
  1. 34 9
      driver/src/msm_mmrm.c

+ 34 - 9
driver/src/msm_mmrm.c

@@ -43,6 +43,11 @@ struct mmrm_client *mmrm_client_register(struct mmrm_client_desc *client_desc)
 		goto err_exit;
 	}
 
+	if (drv_data == (void *) -EPROBE_DEFER) {
+		d_mpr_e("%s: mmrm probe_init not done\n", __func__);
+		goto err_exit;
+	}
+
 	/* check for client type, then register */
 	if (client_desc->client_type == MMRM_CLIENT_CLOCK) {
 		client = mmrm_clk_client_register(
@@ -61,7 +66,7 @@ struct mmrm_client *mmrm_client_register(struct mmrm_client_desc *client_desc)
 	return client;
 
 err_exit:
-	d_mpr_h("%s: error exit\n", __func__);
+	d_mpr_e("%s: error exit\n", __func__);
 	return client;
 }
 EXPORT_SYMBOL(mmrm_client_register);
@@ -79,6 +84,11 @@ int mmrm_client_deregister(struct mmrm_client *client)
 		goto err_exit;
 	}
 
+	if (drv_data == (void *) -EPROBE_DEFER) {
+		d_mpr_e("%s: mmrm probe_init not done\n", __func__);
+		goto err_exit;
+	}
+
 	/* check for client type, then deregister */
 	if (client->client_type == MMRM_CLIENT_CLOCK) {
 		rc = mmrm_clk_client_deregister(drv_data->clk_mgr, client);
@@ -95,7 +105,7 @@ int mmrm_client_deregister(struct mmrm_client *client)
 	return rc;
 
 err_exit:
-	d_mpr_h("%s: error exit\n", __func__);
+	d_mpr_e("%s: error exit\n", __func__);
 	return rc;
 }
 EXPORT_SYMBOL(mmrm_client_deregister);
@@ -115,6 +125,11 @@ int mmrm_client_set_value(struct mmrm_client *client,
 		goto err_exit;
 	}
 
+	if (drv_data == (void *) -EPROBE_DEFER) {
+		d_mpr_e("%s: mmrm probe_init not done\n", __func__);
+		goto err_exit;
+	}
+
 	/* check for client type, then set value */
 	if (client->client_type == MMRM_CLIENT_CLOCK) {
 		rc = mmrm_clk_client_setval(drv_data->clk_mgr, client,
@@ -132,7 +147,7 @@ int mmrm_client_set_value(struct mmrm_client *client,
 	return rc;
 
 err_exit:
-	d_mpr_h("%s: error exit\n", __func__);
+	d_mpr_e("%s: error exit\n", __func__);
 	return rc;
 }
 EXPORT_SYMBOL(mmrm_client_set_value);
@@ -154,6 +169,11 @@ int mmrm_client_set_value_in_range(struct mmrm_client *client,
 		goto err_exit;
 	}
 
+	if (drv_data == (void *) -EPROBE_DEFER) {
+		d_mpr_e("%s: mmrm probe_init not done\n", __func__);
+		goto err_exit;
+	}
+
 	/* check for client type, then set value */
 	if (client->client_type == MMRM_CLIENT_CLOCK) {
 		rc = mmrm_clk_client_setval_inrange(drv_data->clk_mgr,
@@ -171,7 +191,7 @@ int mmrm_client_set_value_in_range(struct mmrm_client *client,
 	return rc;
 
 err_exit:
-	d_mpr_h("%s: error exit\n", __func__);
+	d_mpr_e("%s: error exit\n", __func__);
 	return rc;
 }
 EXPORT_SYMBOL(mmrm_client_set_value_in_range);
@@ -191,6 +211,11 @@ int mmrm_client_get_value(struct mmrm_client *client,
 		goto err_exit;
 	}
 
+	if (drv_data == (void *) -EPROBE_DEFER) {
+		d_mpr_e("%s: mmrm probe_init not done\n", __func__);
+		goto err_exit;
+	}
+
 	/* check for client type, then get value */
 	if (client->client_type == MMRM_CLIENT_CLOCK) {
 		rc = mmrm_clk_client_getval(drv_data->clk_mgr,
@@ -208,7 +233,7 @@ int mmrm_client_get_value(struct mmrm_client *client,
 	return rc;
 
 err_exit:
-	d_mpr_h("%s: error exit\n", __func__);
+	d_mpr_e("%s: error exit\n", __func__);
 	return rc;
 }
 EXPORT_SYMBOL(mmrm_client_get_value);
@@ -265,7 +290,7 @@ err_read_pltfrm_rsc:
 err_get_drv_data:
 	RESET_DRV_DATA(drv_data);
 err_no_mem:
-	d_mpr_h("%s: error exit\n", __func__);
+	d_mpr_e("%s: error exit\n", __func__);
 	return rc;
 }
 
@@ -284,7 +309,7 @@ static int msm_mmrm_probe(struct platform_device *pdev)
 	return rc;
 
 err_exit:
-	d_mpr_h("%s: error exit\n", __func__);
+	d_mpr_e("%s: error exit\n", __func__);
 	return rc;
 }
 
@@ -310,7 +335,7 @@ static int msm_mmrm_remove(struct platform_device *pdev)
 	return rc;
 
 err_exit:
-	d_mpr_h("%s: error exit\n", __func__);
+	d_mpr_e("%s: error exit\n", __func__);
 	return rc;
 }
 
@@ -347,7 +372,7 @@ static int __init msm_mmrm_init(void)
 	return rc;
 
 err_platform_drv_reg:
-	d_mpr_h("%s: error exit\n", __func__);
+	d_mpr_e("%s: error exit\n", __func__);
 	return rc;
 }