@@ -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