mmrm: Implement debugfs and logging levels
Use debug_level file in debugfs to set logging level. Change-Id: I1e378437039ceb59c44ff51f4eb6240804aa5f53
This commit is contained in:
@@ -29,6 +29,8 @@ static struct mmrm_client *mmrm_sw_clk_client_register(
|
||||
u32 c = 0;
|
||||
u32 clk_client_src_id = 0;
|
||||
|
||||
d_mpr_h("%s: entering\n", __func__);
|
||||
|
||||
mutex_lock(&sw_clk_mgr->lock);
|
||||
|
||||
/* check if entry is free in table */
|
||||
@@ -85,7 +87,7 @@ static struct mmrm_client *mmrm_sw_clk_client_register(
|
||||
tbl_entry->notifier_cb_fn = not_fn_cb;
|
||||
|
||||
/* print table entry */
|
||||
d_mpr_e("%s: csid(%d) name(%s) pri(%d) pvt(%p) notifier(%p)\n",
|
||||
d_mpr_h("%s: csid(%d) name(%s) pri(%d) pvt(%p) notifier(%p)\n",
|
||||
__func__,
|
||||
tbl_entry->clk_src_id,
|
||||
tbl_entry->name,
|
||||
@@ -94,7 +96,7 @@ static struct mmrm_client *mmrm_sw_clk_client_register(
|
||||
tbl_entry->notifier_cb_fn);
|
||||
|
||||
/* print power entries for the clk src */
|
||||
d_mpr_e("%s: csid(%d) l0_cur(%d) l0_cur(%d) l0_cur(%d)\n",
|
||||
d_mpr_h("%s: csid(%d) l1_cur_ma(%d) l2_cur_ma(%d) l3_cur_ma(%d)\n",
|
||||
__func__,
|
||||
tbl_entry->clk_src_id,
|
||||
tbl_entry->current_ma[MMRM_VDD_LEVEL_SVS_L1],
|
||||
@@ -103,12 +105,15 @@ static struct mmrm_client *mmrm_sw_clk_client_register(
|
||||
|
||||
mutex_unlock(&sw_clk_mgr->lock);
|
||||
|
||||
d_mpr_h("%s: exiting with success\n", __func__);
|
||||
return clk_client;
|
||||
|
||||
err_fail_alloc_clk_client:
|
||||
err_already_registered:
|
||||
err_nofree_entry:
|
||||
mutex_unlock(&sw_clk_mgr->lock);
|
||||
|
||||
d_mpr_h("%s: error exit\n", __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -119,7 +124,7 @@ static int mmrm_sw_clk_client_deregister(struct mmrm_clk_mgr *sw_clk_mgr,
|
||||
struct mmrm_sw_clk_client_tbl_entry *tbl_entry;
|
||||
struct mmrm_sw_clk_mgr_info *sinfo = &(sw_clk_mgr->data.sw_info);
|
||||
|
||||
d_mpr_e("%s: entering\n", __func__);
|
||||
d_mpr_h("%s: entering\n", __func__);
|
||||
|
||||
/* validate the client ptr */
|
||||
if (!client || client->client_uid >= sinfo->tot_clk_clients) {
|
||||
@@ -141,9 +146,11 @@ static int mmrm_sw_clk_client_deregister(struct mmrm_clk_mgr *sw_clk_mgr,
|
||||
|
||||
mutex_unlock(&sw_clk_mgr->lock);
|
||||
|
||||
d_mpr_h("%s: exiting with success\n", __func__);
|
||||
return rc;
|
||||
|
||||
err_not_valid_client:
|
||||
d_mpr_h("%s: error exit\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -187,8 +194,6 @@ static int mmrm_sw_check_peak_current(
|
||||
struct mmrm_sw_peak_current_data *peak_data = &sinfo->peak_cur_data;
|
||||
|
||||
/* check for peak overshoot */
|
||||
d_mpr_h("%s: entering\n", __func__);
|
||||
|
||||
if ((peak_data->aggreg_val + req_cur) >= peak_data->threshold) {
|
||||
rc = -EINVAL;
|
||||
/* TBD: return from here */
|
||||
@@ -210,7 +215,7 @@ static int mmrm_sw_clk_client_setval(struct mmrm_clk_mgr *sw_clk_mgr,
|
||||
struct mmrm_sw_clk_mgr_info *sinfo = &(sw_clk_mgr->data.sw_info);
|
||||
u32 req_cur;
|
||||
|
||||
d_mpr_e("%s: entering\n", __func__);
|
||||
d_mpr_h("%s: entering\n", __func__);
|
||||
|
||||
/* validate input params */
|
||||
if (!client || client->client_uid >= sinfo->tot_clk_clients) {
|
||||
@@ -220,6 +225,7 @@ static int mmrm_sw_clk_client_setval(struct mmrm_clk_mgr *sw_clk_mgr,
|
||||
goto err_invalid_client;
|
||||
}
|
||||
|
||||
/* get table entry */
|
||||
tbl_entry = &sinfo->clk_client_tbl[client->client_uid];
|
||||
if (!tbl_entry->clk) {
|
||||
d_mpr_e("%s: clk src not registered\n");
|
||||
@@ -271,11 +277,13 @@ static int mmrm_sw_clk_client_setval(struct mmrm_clk_mgr *sw_clk_mgr,
|
||||
}
|
||||
|
||||
exit_no_err:
|
||||
d_mpr_h("%s: exiting with success\n", __func__);
|
||||
return rc;
|
||||
|
||||
err_invalid_clk_val:
|
||||
err_invalid_client:
|
||||
err_clk_set_fail:
|
||||
d_mpr_h("%s: error exit\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -284,7 +292,7 @@ static int mmrm_sw_clk_client_setval_inrange(struct mmrm_clk_mgr *sw_clk_mgr,
|
||||
struct mmrm_client_data *client_data,
|
||||
struct mmrm_client_res_value *val)
|
||||
{
|
||||
d_mpr_e("%s: entering\n", __func__);
|
||||
d_mpr_h("%s: entering\n", __func__);
|
||||
|
||||
/* TBD: add support for set val in range */
|
||||
return mmrm_sw_clk_client_setval(sw_clk_mgr, client, client_data,
|
||||
@@ -299,7 +307,7 @@ static int mmrm_sw_clk_client_getval(struct mmrm_clk_mgr *sw_clk_mgr,
|
||||
struct mmrm_sw_clk_client_tbl_entry *tbl_entry;
|
||||
struct mmrm_sw_clk_mgr_info *sinfo = &(sw_clk_mgr->data.sw_info);
|
||||
|
||||
d_mpr_e("%s: entering\n", __func__);
|
||||
d_mpr_h("%s: entering\n", __func__);
|
||||
|
||||
/* validate input params */
|
||||
if (!client || client->client_uid >= sinfo->tot_clk_clients) {
|
||||
@@ -322,9 +330,11 @@ static int mmrm_sw_clk_client_getval(struct mmrm_clk_mgr *sw_clk_mgr,
|
||||
val->cur = tbl_entry->clk_rate;
|
||||
val->max = tbl_entry->clk_rate;
|
||||
|
||||
d_mpr_h("%s: exiting with success\n", __func__);
|
||||
return rc;
|
||||
|
||||
err_invalid_client:
|
||||
d_mpr_h("%s: error exit\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -352,7 +362,7 @@ static int mmrm_sw_update_entries(struct mmrm_clk_platform_resources *cres,
|
||||
/* freq scaling only for svsl1, TBD: enhance with actual numbers */
|
||||
freq_sc = FP(0, 86, 100);
|
||||
|
||||
/* update power & curernt entries for all levels */
|
||||
/* update power & current entries for all levels */
|
||||
for (i = 0; i < MMRM_VDD_LEVEL_MAX; i++) {
|
||||
scaling_factor = cset->corner_tbl[i].scaling_factor_dyn;
|
||||
dyn_sc = FP(
|
||||
@@ -378,8 +388,8 @@ static int mmrm_sw_update_entries(struct mmrm_clk_platform_resources *cres,
|
||||
tbl_entry->leak_pwr[i] = fp_round(leak_pwr);
|
||||
tbl_entry->current_ma[i] =
|
||||
fp_round(fp_div((dyn_pwr+leak_pwr), volt));
|
||||
/*
|
||||
d_mpr_e("%s: csid(%d) corner(%s) dyn_pwr(%zu) leak_pwr(%zu) tot_pwr(%d) cur_ma(%d)\n",
|
||||
|
||||
d_mpr_h("%s: csid(%d) corner(%s) dyn_pwr(%zu) leak_pwr(%zu) tot_pwr(%d) cur_ma(%d)\n",
|
||||
__func__,
|
||||
tbl_entry->clk_src_id,
|
||||
cset->corner_tbl[i].name,
|
||||
@@ -387,7 +397,6 @@ static int mmrm_sw_update_entries(struct mmrm_clk_platform_resources *cres,
|
||||
tbl_entry->leak_pwr[i],
|
||||
fp_round(dyn_pwr+leak_pwr),
|
||||
tbl_entry->current_ma[i]);
|
||||
*/
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -401,7 +410,7 @@ static int mmrm_sw_prepare_table(struct mmrm_clk_platform_resources *cres,
|
||||
struct mmrm_sw_clk_client_tbl_entry *tbl_entry;
|
||||
struct nom_clk_src_info *nom_tbl_entry;
|
||||
|
||||
d_mpr_e("%s: entering\n", __func__);
|
||||
d_mpr_h("%s: entering\n", __func__);
|
||||
|
||||
/* read all resource entries */
|
||||
for (c = 0; c < sinfo->tot_clk_clients; c++) {
|
||||
@@ -415,10 +424,11 @@ static int mmrm_sw_prepare_table(struct mmrm_clk_platform_resources *cres,
|
||||
tbl_entry->leak_pwr[MMRM_VDD_LEVEL_NOM] =
|
||||
nom_tbl_entry->nom_leak_pwr;
|
||||
|
||||
//d_mpr_e("%s: updating csid(%d) dyn_pwr(%d) leak_pwr(%d)\n",
|
||||
// __func__, tbl_entry->clk_src_id,
|
||||
// tbl_entry->dyn_pwr[MMRM_VDD_LEVEL_NOM],
|
||||
// tbl_entry->leak_pwr[MMRM_VDD_LEVEL_NOM]);
|
||||
d_mpr_h("%s: updating csid(%d) dyn_pwr(%d) leak_pwr(%d)\n",
|
||||
__func__,
|
||||
tbl_entry->clk_src_id,
|
||||
tbl_entry->dyn_pwr[MMRM_VDD_LEVEL_NOM],
|
||||
tbl_entry->leak_pwr[MMRM_VDD_LEVEL_NOM]);
|
||||
|
||||
/* calculate current & scale power for other levels */
|
||||
rc = mmrm_sw_update_entries(cres, tbl_entry);
|
||||
@@ -431,13 +441,15 @@ static int mmrm_sw_prepare_table(struct mmrm_clk_platform_resources *cres,
|
||||
/* print the tables */
|
||||
for (c = 0; c < sinfo->tot_clk_clients; c++) {
|
||||
tbl_entry = &sinfo->clk_client_tbl[c];
|
||||
d_mpr_e("%s: csid(%d) l1_cur_ma(%d) l2_cur_ma(%d) l3_cur_ma(%d)\n",
|
||||
__func__, tbl_entry->clk_src_id,
|
||||
d_mpr_h("%s: csid(%d) l1_cur_ma(%d) l2_cur_ma(%d) l3_cur_ma(%d)\n",
|
||||
__func__,
|
||||
tbl_entry->clk_src_id,
|
||||
tbl_entry->current_ma[MMRM_VDD_LEVEL_SVS_L1],
|
||||
tbl_entry->current_ma[MMRM_VDD_LEVEL_NOM],
|
||||
tbl_entry->current_ma[MMRM_VDD_LEVEL_TURBO]);
|
||||
}
|
||||
|
||||
d_mpr_h("%s: exiting\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -451,7 +463,7 @@ int mmrm_init_sw_clk_mgr(void *driver_data)
|
||||
struct mmrm_clk_mgr *sw_clk_mgr = NULL;
|
||||
u32 tbl_size = 0;
|
||||
|
||||
d_mpr_e("%s: entering\n", __func__);
|
||||
d_mpr_h("%s: entering\n", __func__);
|
||||
|
||||
/* mmrm_sw_clk_mgr */
|
||||
sw_clk_mgr = kzalloc(sizeof(*sw_clk_mgr), GFP_KERNEL);
|
||||
@@ -481,16 +493,13 @@ int mmrm_init_sw_clk_mgr(void *driver_data)
|
||||
/* prepare table entries */
|
||||
rc = mmrm_sw_prepare_table(cres, sinfo);
|
||||
if (rc) {
|
||||
d_mpr_e(
|
||||
"%s: failed to prepare clk table\n",
|
||||
__func__);
|
||||
d_mpr_e("%s: failed to prepare clk table\n", __func__);
|
||||
rc = -ENOMEM;
|
||||
goto err_fail_prep_tbl;
|
||||
}
|
||||
|
||||
/* update the peak current threshold */
|
||||
sinfo->peak_cur_data.threshold =
|
||||
cres->threshold;
|
||||
sinfo->peak_cur_data.threshold = cres->threshold;
|
||||
sinfo->peak_cur_data.aggreg_val = 0;
|
||||
|
||||
/* initialize mutex for sw clk mgr */
|
||||
@@ -501,8 +510,7 @@ int mmrm_init_sw_clk_mgr(void *driver_data)
|
||||
sw_clk_mgr->clk_client_ops = &clk_client_swops;
|
||||
drv_data->clk_mgr = sw_clk_mgr;
|
||||
|
||||
d_mpr_e("%s: exiting\n", __func__);
|
||||
|
||||
d_mpr_h("%s: exiting with success\n", __func__);
|
||||
return rc;
|
||||
|
||||
err_fail_prep_tbl:
|
||||
@@ -511,7 +519,7 @@ err_fail_clk_tbl:
|
||||
kfree(sw_clk_mgr);
|
||||
drv_data->clk_mgr = NULL;
|
||||
err_fail_sw_clk_mgr:
|
||||
d_mpr_e("%s: exiting with error %d\n", __func__, rc);
|
||||
d_mpr_h("%s: error exit\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@@ -2,14 +2,97 @@
|
||||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "mmrm_debug.h"
|
||||
|
||||
int msm_mmrm_debug = MMRM_ERR | MMRM_PRINTK;
|
||||
|
||||
#define MAX_DBG_BUF_SIZE 4096
|
||||
|
||||
static ssize_t msm_mmrm_debugfs_info_read(struct file *file,
|
||||
char __user *buf,
|
||||
size_t count,
|
||||
loff_t *ppos)
|
||||
{
|
||||
char *dbuf, *cur, *end;
|
||||
ssize_t len = 0;
|
||||
|
||||
dbuf = kzalloc(MAX_DBG_BUF_SIZE, GFP_KERNEL);
|
||||
if (!dbuf)
|
||||
{
|
||||
d_mpr_e("%s: Allocation failed!\n", __func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
cur = dbuf;
|
||||
end = cur + MAX_DBG_BUF_SIZE;
|
||||
|
||||
// TODO: Fill cur here
|
||||
|
||||
len = simple_read_from_buffer(buf, count, ppos, dbuf, cur - dbuf);
|
||||
kfree(dbuf);
|
||||
return len;
|
||||
}
|
||||
|
||||
const struct file_operations msm_mmrm_debugfs_info_fops = {
|
||||
.open = simple_open,
|
||||
.read = msm_mmrm_debugfs_info_read,
|
||||
};
|
||||
|
||||
struct dentry *msm_mmrm_debugfs_init(void)
|
||||
{
|
||||
struct dentry *dir;
|
||||
int file_val;
|
||||
bool ok = false;
|
||||
|
||||
d_mpr_h("%s: entering\n", __func__);
|
||||
|
||||
/* create a directory in debugfs root (/sys/kernel/debug) */
|
||||
dir = debugfs_create_dir("msm_mmrm", NULL);
|
||||
if (IS_ERR_OR_NULL(dir))
|
||||
{
|
||||
d_mpr_e("%s: Call to debugfs_create_dir(%s) failed!\n", __func__, "mmrm");
|
||||
goto failed_create_dir;
|
||||
}
|
||||
|
||||
/* basic info */
|
||||
if (!debugfs_create_file("info", 0444, dir, &file_val, &msm_mmrm_debugfs_info_fops))
|
||||
{
|
||||
d_mpr_e("%s: Call to debugfs_create_file(%s) failed!\n", __func__, "info");
|
||||
goto failed_create_dir;
|
||||
}
|
||||
|
||||
#define __debugfs_create(__type, __name, __value) ({ \
|
||||
struct dentry *f = debugfs_create_##__type(__name, 0644, dir, __value); \
|
||||
if (IS_ERR_OR_NULL(f)) { \
|
||||
d_mpr_e("%s: Failed creating debugfs file '%pd/%s'\n", \
|
||||
__func__, dir, __name); \
|
||||
f = NULL; \
|
||||
} \
|
||||
f; \
|
||||
})
|
||||
|
||||
/* add other params here */
|
||||
ok =
|
||||
__debugfs_create(u32, "debug_level", &msm_mmrm_debug);
|
||||
|
||||
#undef __debugfs_create
|
||||
|
||||
if (!ok)
|
||||
goto failed_create_dir;
|
||||
|
||||
d_mpr_h("%s: exiting\n", __func__);
|
||||
return dir;
|
||||
|
||||
failed_create_dir:
|
||||
d_mpr_h("%s: error exit\n", __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void msm_mmrm_debugfs_deinit(void)
|
||||
void msm_mmrm_debugfs_deinit(struct dentry *dir)
|
||||
{
|
||||
d_mpr_h("%s: entering\n", __func__);
|
||||
debugfs_remove_recursive(dir);
|
||||
d_mpr_h("%s: exiting\n", __func__);
|
||||
}
|
||||
|
||||
|
@@ -13,8 +13,55 @@
|
||||
#define MMRM_DBG_LABEL "msm_mmrm: "
|
||||
#endif
|
||||
|
||||
//#define d_mpr_h(__fmt, ...) pr_info(MMRM_DBG_LABEL __fmt, ##__VA_ARGS__)
|
||||
#define d_mpr_h(__fmt, ...) pr_err(MMRM_DBG_LABEL __fmt, ##__VA_ARGS__)
|
||||
#define d_mpr_e(__fmt, ...) pr_err(MMRM_DBG_LABEL __fmt, ##__VA_ARGS__)
|
||||
#define MMRM_DBG_TAG MMRM_DBG_LABEL ": %4s: "
|
||||
|
||||
/* To enable messages OR these values and
|
||||
* echo the result to debugfs file.
|
||||
*/
|
||||
enum mmrm_msg_prio
|
||||
{
|
||||
MMRM_ERR = 0x000001,
|
||||
MMRM_HIGH = 0x000002,
|
||||
MMRM_LOW = 0x000004,
|
||||
MMRM_PRINTK = 0x010000,
|
||||
MMRM_FTRACE = 0x020000,
|
||||
};
|
||||
|
||||
extern int msm_mmrm_debug;
|
||||
|
||||
#define dprintk(__level, __fmt, ...) \
|
||||
do \
|
||||
{ \
|
||||
if (msm_mmrm_debug & __level) \
|
||||
{ \
|
||||
if (msm_mmrm_debug & MMRM_PRINTK) \
|
||||
{ \
|
||||
pr_info(MMRM_DBG_TAG __fmt, \
|
||||
get_debug_level_str(__level), ##__VA_ARGS__); \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define d_mpr_e(__fmt, ...) dprintk(MMRM_ERR, __fmt, ##__VA_ARGS__)
|
||||
#define d_mpr_h(__fmt, ...) dprintk(MMRM_HIGH, __fmt, ##__VA_ARGS__)
|
||||
#define d_mpr_l(__fmt, ...) dprintk(MMRM_LOW, __fmt, ##__VA_ARGS__)
|
||||
|
||||
static inline char *get_debug_level_str(int level)
|
||||
{
|
||||
switch (level)
|
||||
{
|
||||
case MMRM_ERR:
|
||||
return "err ";
|
||||
case MMRM_HIGH:
|
||||
return "high";
|
||||
case MMRM_LOW:
|
||||
return "low ";
|
||||
default:
|
||||
return "????";
|
||||
}
|
||||
}
|
||||
|
||||
struct dentry *msm_mmrm_debugfs_init(void);
|
||||
void msm_mmrm_debugfs_deinit(struct dentry *dir);
|
||||
|
||||
#endif
|
||||
|
@@ -31,6 +31,9 @@ struct mmrm_driver_data {
|
||||
struct mmrm_clk_platform_resources clk_res;
|
||||
struct mmrm_clk_mgr *clk_mgr;
|
||||
struct mmrm_clk_mgr_ops *clk_mgr_ops;
|
||||
|
||||
/* debugfs */
|
||||
struct dentry *debugfs_root;
|
||||
};
|
||||
|
||||
struct mmrm_platform_data *mmrm_get_platform_data(struct device *dev);
|
||||
|
@@ -218,6 +218,7 @@ static int msm_mmrm_probe_init(struct platform_device *pdev)
|
||||
int rc = 0;
|
||||
|
||||
d_mpr_h("%s: entering\n", __func__);
|
||||
|
||||
drv_data = kzalloc(sizeof(*drv_data), GFP_KERNEL);
|
||||
if (!drv_data) {
|
||||
d_mpr_e("%s: unable to allocate memory for mmrm driver\n",
|
||||
@@ -234,6 +235,10 @@ static int msm_mmrm_probe_init(struct platform_device *pdev)
|
||||
goto err_get_drv_data;
|
||||
}
|
||||
|
||||
drv_data->debugfs_root = msm_mmrm_debugfs_init();
|
||||
if (!drv_data->debugfs_root)
|
||||
d_mpr_e("%s: failed to create debugfs for mmrm\n", __func__);
|
||||
|
||||
dev_set_drvdata(&pdev->dev, drv_data);
|
||||
|
||||
rc = mmrm_read_platform_resources(pdev, drv_data);
|
||||
@@ -251,15 +256,16 @@ static int msm_mmrm_probe_init(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
d_mpr_h("%s: exiting with success\n", __func__);
|
||||
|
||||
return rc;
|
||||
|
||||
err_mmrm_init:
|
||||
msm_mmrm_debugfs_deinit(drv_data->debugfs_root);
|
||||
err_read_pltfrm_rsc:
|
||||
mmrm_free_platform_resources(drv_data);
|
||||
err_get_drv_data:
|
||||
RESET_DRV_DATA(drv_data);
|
||||
err_no_mem:
|
||||
d_mpr_h("%s: error exit\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -275,10 +281,10 @@ static int msm_mmrm_probe(struct platform_device *pdev)
|
||||
return msm_mmrm_probe_init(pdev);
|
||||
|
||||
d_mpr_h("%s: exiting: no compatible device node\n", __func__);
|
||||
|
||||
return rc;
|
||||
|
||||
err_exit:
|
||||
d_mpr_h("%s: error exit\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -294,14 +300,17 @@ static int msm_mmrm_remove(struct platform_device *pdev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
msm_mmrm_debugfs_deinit(drv_data->debugfs_root);
|
||||
mmrm_deinit(drv_data);
|
||||
mmrm_free_platform_resources(drv_data);
|
||||
dev_set_drvdata(&pdev->dev, NULL);
|
||||
RESET_DRV_DATA(drv_data);
|
||||
|
||||
d_mpr_h("%s: exiting with success\n", __func__);
|
||||
return rc;
|
||||
|
||||
err_exit:
|
||||
d_mpr_h("%s: error exit\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -310,7 +319,7 @@ static const struct of_device_id msm_mmrm_dt_match[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(of, msm_mmrm_of_match);
|
||||
MODULE_DEVICE_TABLE(of, msm_mmrm_dt_match);
|
||||
|
||||
static struct platform_driver msm_mmrm_driver = {
|
||||
.probe = msm_mmrm_probe,
|
||||
@@ -335,10 +344,10 @@ static int __init msm_mmrm_init(void)
|
||||
}
|
||||
|
||||
d_mpr_h("%s: exiting\n", __func__);
|
||||
|
||||
return rc;
|
||||
|
||||
err_platform_drv_reg:
|
||||
d_mpr_h("%s: error exit\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user