Skip to content

Commit 7eedb27

Browse files
finley1226rkhuangtao
authored andcommitted
PM / devfreq: rockchip_dmc: Adjust voltage according to opp table when probe
If dmc node doesn't contain 'system-status-freq' and auto-freq is disabled, devfreq feature won't be added and only to adjust voltage according to opp table. Change-Id: Iaf9d9f61938babff2e08719e2285a8554cfa9389 Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
1 parent 4f67042 commit 7eedb27

1 file changed

Lines changed: 39 additions & 20 deletions

File tree

drivers/devfreq/rockchip_dmc.c

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1995,7 +1995,7 @@ static int rockchip_get_system_status_rate(struct device_node *np,
19951995

19961996
prop = of_find_property(np, porp_name, NULL);
19971997
if (!prop)
1998-
return -EINVAL;
1998+
return -ENODEV;
19991999

20002000
if (!prop->value)
20012001
return -ENODATA;
@@ -2797,10 +2797,11 @@ static int rockchip_dmcfreq_probe(struct platform_device *pdev)
27972797
struct device_node *events_np, *np = pdev->dev.of_node;
27982798
struct rockchip_dmcfreq *data;
27992799
struct devfreq_dev_profile *devp = &rockchip_devfreq_dmc_profile;
2800+
struct dev_pm_opp *opp;
28002801
const struct of_device_id *match;
28012802
int (*init)(struct platform_device *pdev,
28022803
struct rockchip_dmcfreq *data);
2803-
unsigned long opp_rate;
2804+
unsigned long opp_rate, opp_volt;
28042805
#define MAX_PROP_NAME_LEN 3
28052806
char name[MAX_PROP_NAME_LEN];
28062807
bool is_events_available = false;
@@ -2872,36 +2873,59 @@ static int rockchip_dmcfreq_probe(struct platform_device *pdev)
28722873
if (rockchip_dmcfreq_init_freq_table(dev, devp))
28732874
return -EFAULT;
28742875

2875-
of_property_read_u32(np, "upthreshold",
2876-
&data->ondemand_data.upthreshold);
2877-
of_property_read_u32(np, "downdifferential",
2878-
&data->ondemand_data.downdifferential);
2879-
of_property_read_u32(np, "min-cpu-freq", &data->min_cpu_freq);
2880-
if (rockchip_get_system_status_rate(np, "system-status-freq", data))
2881-
dev_err(dev, "failed to get system status rate\n");
2876+
data->rate = clk_get_rate(data->dmc_clk);
2877+
data->volt = regulator_get_voltage(data->vdd_center);
2878+
devp->initial_freq = data->rate;
2879+
opp_rate = data->rate;
2880+
2881+
rcu_read_lock();
2882+
opp = devfreq_recommended_opp(dev, &opp_rate, 0);
2883+
if (IS_ERR(opp)) {
2884+
rcu_read_unlock();
2885+
return PTR_ERR(opp);
2886+
}
2887+
opp_volt = dev_pm_opp_get_voltage(opp);
2888+
rcu_read_unlock();
2889+
2890+
if (opp_volt != data->volt) {
2891+
ret = regulator_set_voltage(data->vdd_center, opp_volt,
2892+
INT_MAX);
2893+
if (ret) {
2894+
dev_err(dev, "Cannot set voltage %lu uV\n", opp_volt);
2895+
return ret;
2896+
}
2897+
}
2898+
28822899
of_property_read_u32(np, "auto-freq-en", &data->auto_freq_en);
28832900
if (!is_events_available && data->auto_freq_en) {
28842901
dev_warn(dev, "events isn't available, close auto freq\n");
28852902
data->auto_freq_en = 0;
28862903
}
2904+
ret = rockchip_get_system_status_rate(np, "system-status-freq", data);
2905+
if (ret) {
2906+
dev_err(dev, "failed to get system status rate\n");
2907+
if (ret == -ENODEV && !data->auto_freq_en) {
2908+
dev_info(dev, "don't add devfreq feature\n");
2909+
return 0;
2910+
}
2911+
}
2912+
of_property_read_u32(np, "upthreshold",
2913+
&data->ondemand_data.upthreshold);
2914+
of_property_read_u32(np, "downdifferential",
2915+
&data->ondemand_data.downdifferential);
2916+
of_property_read_u32(np, "min-cpu-freq", &data->min_cpu_freq);
28872917
of_property_read_u32(np, "auto-min-freq", (u32 *)&data->auto_min_rate);
28882918
data->auto_min_rate *= 1000;
28892919
if (rockchip_get_freq_map_talbe(np, "vop-bw-dmc-freq",
28902920
&data->vop_bw_tbl))
28912921
dev_err(dev, "failed to get vop bandwidth to dmc rate\n");
2892-
28932922
of_property_read_u32(np, "touchboost_duration",
28942923
(u32 *)&data->touchboostpulse_duration_val);
28952924
if (data->touchboostpulse_duration_val)
28962925
data->touchboostpulse_duration_val *= USEC_PER_MSEC;
28972926
else
28982927
data->touchboostpulse_duration_val = 500 * USEC_PER_MSEC;
28992928

2900-
data->rate = clk_get_rate(data->dmc_clk);
2901-
data->volt = regulator_get_voltage(data->vdd_center);
2902-
2903-
devp->initial_freq = data->rate;
2904-
29052929
ret = devfreq_add_governor(&devfreq_dmc_ondemand);
29062930
if (ret) {
29072931
dev_err(dev, "Failed to add rockchip governor: %d\n", ret);
@@ -2919,11 +2943,6 @@ static int rockchip_dmcfreq_probe(struct platform_device *pdev)
29192943

29202944
devm_devfreq_register_opp_notifier(dev, data->devfreq);
29212945

2922-
opp_rate = data->rate;
2923-
rcu_read_lock();
2924-
devfreq_recommended_opp(dev, &opp_rate, 0);
2925-
rcu_read_unlock();
2926-
29272946
data->min = devp->freq_table[0];
29282947
data->max = devp->freq_table[devp->max_state ? devp->max_state - 1 : 0];
29292948
data->devfreq->min_freq = data->min;

0 commit comments

Comments
 (0)