mmrm: Resolve for invalid voltage corner values

- When qcom_clk_get_voltage encounters an error,
return the error.
- When qcom_clk_get_voltage returns a level higher
than supported, return an error.
- Added warning debug level.
- Minor formatting changes.

Change-Id: I6d7147f6af83bff2d84ef40c3a11cfef7faca391
This commit is contained in:
Sebastian Dang
2020-11-24 14:32:27 -08:00
szülő 641f2047ad
commit 7657a22ccf
4 fájl változott, egészen pontosan 52 új sor hozzáadva és 38 régi sor törölve

Fájl megtekintése

@@ -164,12 +164,23 @@ static int mmrm_sw_get_req_level(
/* get voltage corner */ /* get voltage corner */
voltage_corner = qcom_clk_get_voltage(tbl_entry->clk, clk_val); voltage_corner = qcom_clk_get_voltage(tbl_entry->clk, clk_val);
if (voltage_corner < 0 || voltage_corner > mmrm_sw_vdd_corner[MMRM_VDD_LEVEL_TURBO]) {
d_mpr_e("%s: csid(%d): invalid voltage corner(%d) for clk rate(%llu)\n",
__func__,
tbl_entry->clk_src_id,
voltage_corner,
clk_val);
rc = voltage_corner;
goto err_invalid_corner;
}
/* voltage corner is below svsl1 */ /* voltage corner is below svsl1 */
if (voltage_corner < mmrm_sw_vdd_corner[MMRM_VDD_LEVEL_SVS_L1]) { if (voltage_corner < mmrm_sw_vdd_corner[MMRM_VDD_LEVEL_SVS_L1]) {
/* TBD: remove this when scaling calculations are added */ /* TBD: remove this when scaling calculations are added */
d_mpr_e("%s: csid(%d): lower voltage corner(%d)\n", d_mpr_w("%s: csid(%d): lower voltage corner(%d)\n",
__func__, tbl_entry->clk_src_id, voltage_corner); __func__,
tbl_entry->clk_src_id,
voltage_corner);
*req_level = MMRM_VDD_LEVEL_SVS_L1; *req_level = MMRM_VDD_LEVEL_SVS_L1;
goto exit_no_err; goto exit_no_err;
} }
@@ -182,7 +193,10 @@ static int mmrm_sw_get_req_level(
if (level == MMRM_VDD_LEVEL_MAX) { if (level == MMRM_VDD_LEVEL_MAX) {
d_mpr_e("%s: csid(%d): invalid voltage corner(%d) for clk rate(%llu)\n", d_mpr_e("%s: csid(%d): invalid voltage corner(%d) for clk rate(%llu)\n",
__func__, tbl_entry->clk_src_id, voltage_corner, clk_val); __func__,
tbl_entry->clk_src_id,
voltage_corner,
clk_val);
rc = -EINVAL; rc = -EINVAL;
goto err_invalid_corner; goto err_invalid_corner;
} }

Fájl megtekintése

@@ -7,21 +7,18 @@
#include "mmrm_debug.h" #include "mmrm_debug.h"
int msm_mmrm_debug = MMRM_ERR | MMRM_PRINTK; int msm_mmrm_debug = MMRM_ERR | MMRM_WARN | MMRM_PRINTK;
#define MAX_DBG_BUF_SIZE 4096 #define MAX_DBG_BUF_SIZE 4096
static ssize_t msm_mmrm_debugfs_info_read(struct file *file, static ssize_t msm_mmrm_debugfs_info_read(
char __user *buf, struct file *file, char __user *buf, size_t count, loff_t *ppos)
size_t count,
loff_t *ppos)
{ {
char *dbuf, *cur, *end; char *dbuf, *cur, *end;
ssize_t len = 0; ssize_t len = 0;
dbuf = kzalloc(MAX_DBG_BUF_SIZE, GFP_KERNEL); dbuf = kzalloc(MAX_DBG_BUF_SIZE, GFP_KERNEL);
if (!dbuf) if (!dbuf) {
{
d_mpr_e("%s: Allocation failed!\n", __func__); d_mpr_e("%s: Allocation failed!\n", __func__);
return -ENOMEM; return -ENOMEM;
} }
@@ -50,32 +47,32 @@ struct dentry *msm_mmrm_debugfs_init(void)
/* create a directory in debugfs root (/sys/kernel/debug) */ /* create a directory in debugfs root (/sys/kernel/debug) */
dir = debugfs_create_dir("msm_mmrm", NULL); dir = debugfs_create_dir("msm_mmrm", NULL);
if (IS_ERR_OR_NULL(dir)) if (IS_ERR_OR_NULL(dir)) {
{
d_mpr_e("%s: Call to debugfs_create_dir(%s) failed!\n", __func__, "mmrm"); d_mpr_e("%s: Call to debugfs_create_dir(%s) failed!\n", __func__, "mmrm");
goto failed_create_dir; goto failed_create_dir;
} }
/* basic info */ /* basic info */
if (!debugfs_create_file("info", 0444, dir, &file_val, &msm_mmrm_debugfs_info_fops)) 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"); d_mpr_e("%s: Call to debugfs_create_file(%s) failed!\n", __func__, "info");
goto failed_create_dir; goto failed_create_dir;
} }
#define __debugfs_create(__type, __name, __value) ({ \ #define __debugfs_create(__type, __name, __value) \
struct dentry *f = debugfs_create_##__type(__name, 0644, dir, __value); \ ({ \
if (IS_ERR_OR_NULL(f)) { \ struct dentry *f = debugfs_create_##__type(__name, 0644, dir, __value); \
d_mpr_e("%s: Failed creating debugfs file '%pd/%s'\n", \ if (IS_ERR_OR_NULL(f)) { \
__func__, dir, __name); \ d_mpr_e("%s: Failed creating debugfs file '%pd/%s'\n", \
f = NULL; \ __func__, \
} \ dir, \
f; \ __name); \
}) f = NULL; \
} \
f; \
})
/* add other params here */ /* add other params here */
ok = ok = __debugfs_create(u32, "debug_level", &msm_mmrm_debug);
__debugfs_create(u32, "debug_level", &msm_mmrm_debug);
#undef __debugfs_create #undef __debugfs_create

Fájl megtekintése

@@ -10,7 +10,7 @@
#include <linux/printk.h> #include <linux/printk.h>
#ifndef MMRM_DBG_LABEL #ifndef MMRM_DBG_LABEL
#define MMRM_DBG_LABEL "msm_mmrm: " #define MMRM_DBG_LABEL "msm_mmrm"
#endif #endif
#define MMRM_DBG_TAG MMRM_DBG_LABEL ": %4s: " #define MMRM_DBG_TAG MMRM_DBG_LABEL ": %4s: "
@@ -18,11 +18,11 @@
/* To enable messages OR these values and /* To enable messages OR these values and
* echo the result to debugfs file. * echo the result to debugfs file.
*/ */
enum mmrm_msg_prio enum mmrm_msg_prio {
{
MMRM_ERR = 0x000001, MMRM_ERR = 0x000001,
MMRM_HIGH = 0x000002, MMRM_HIGH = 0x000002,
MMRM_LOW = 0x000004, MMRM_LOW = 0x000004,
MMRM_WARN = 0x000008,
MMRM_PRINTK = 0x010000, MMRM_PRINTK = 0x010000,
MMRM_FTRACE = 0x020000, MMRM_FTRACE = 0x020000,
}; };
@@ -30,14 +30,12 @@ enum mmrm_msg_prio
extern int msm_mmrm_debug; extern int msm_mmrm_debug;
#define dprintk(__level, __fmt, ...) \ #define dprintk(__level, __fmt, ...) \
do \ do { \
{ \ if (msm_mmrm_debug & __level) { \
if (msm_mmrm_debug & __level) \ if (msm_mmrm_debug & MMRM_PRINTK) { \
{ \
if (msm_mmrm_debug & MMRM_PRINTK) \
{ \
pr_info(MMRM_DBG_TAG __fmt, \ pr_info(MMRM_DBG_TAG __fmt, \
get_debug_level_str(__level), ##__VA_ARGS__); \ get_debug_level_str(__level), \
##__VA_ARGS__); \
} \ } \
} \ } \
} while (0) } while (0)
@@ -45,17 +43,19 @@ extern int msm_mmrm_debug;
#define d_mpr_e(__fmt, ...) dprintk(MMRM_ERR, __fmt, ##__VA_ARGS__) #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_h(__fmt, ...) dprintk(MMRM_HIGH, __fmt, ##__VA_ARGS__)
#define d_mpr_l(__fmt, ...) dprintk(MMRM_LOW, __fmt, ##__VA_ARGS__) #define d_mpr_l(__fmt, ...) dprintk(MMRM_LOW, __fmt, ##__VA_ARGS__)
#define d_mpr_w(__fmt, ...) dprintk(MMRM_WARN, __fmt, ##__VA_ARGS__)
static inline char *get_debug_level_str(int level) static inline char *get_debug_level_str(int level)
{ {
switch (level) switch (level) {
{
case MMRM_ERR: case MMRM_ERR:
return "err "; return "err ";
case MMRM_HIGH: case MMRM_HIGH:
return "high"; return "high";
case MMRM_LOW: case MMRM_LOW:
return "low "; return "low ";
case MMRM_WARN:
return "warn";
default: default:
return "????"; return "????";
} }

Fájl megtekintése

@@ -34,13 +34,16 @@ static int mmrm_read_clk_pltfrm_rsrc_frm_drv_data(
pdata = ddata->platform_data; pdata = ddata->platform_data;
cres = &ddata->clk_res; cres = &ddata->clk_res;
cres->threshold = mmrm_find_key_value(pdata, cres->threshold = mmrm_find_key_value(pdata,
"qcom,mmrm_clk_threshold"); "qcom,mmrm_clk_threshold");
d_mpr_e("%s: configured mmrm clk threshold %d\n", d_mpr_e("%s: configured mmrm clk threshold %d\n",
__func__, cres->threshold); __func__, cres->threshold);
cres->scheme = mmrm_find_key_value(pdata, cres->scheme = mmrm_find_key_value(pdata,
"qcom,mmrm clk mgr scheme"); "qcom,mmrm_clk_mgr_scheme");
d_mpr_e("%s: configured mmrm scheme %d\n",
__func__, cres->scheme);
return rc; return rc;
} }