@@ -2743,6 +2743,24 @@ static int _regulator_call_set_voltage_sel(struct regulator_dev *rdev,
2743
2743
return ret ;
2744
2744
}
2745
2745
2746
+ static int _regulator_set_voltage_time (struct regulator_dev * rdev ,
2747
+ int old_uV , int new_uV )
2748
+ {
2749
+ unsigned int ramp_delay = 0 ;
2750
+
2751
+ if (rdev -> constraints -> ramp_delay )
2752
+ ramp_delay = rdev -> constraints -> ramp_delay ;
2753
+ else if (rdev -> desc -> ramp_delay )
2754
+ ramp_delay = rdev -> desc -> ramp_delay ;
2755
+
2756
+ if (ramp_delay == 0 ) {
2757
+ rdev_warn (rdev , "ramp_delay not set\n" );
2758
+ return 0 ;
2759
+ }
2760
+
2761
+ return DIV_ROUND_UP (abs (new_uV - old_uV ), ramp_delay );
2762
+ }
2763
+
2746
2764
static int _regulator_do_set_voltage (struct regulator_dev * rdev ,
2747
2765
int min_uV , int max_uV )
2748
2766
{
@@ -2752,6 +2770,7 @@ static int _regulator_do_set_voltage(struct regulator_dev *rdev,
2752
2770
unsigned int selector ;
2753
2771
int old_selector = -1 ;
2754
2772
const struct regulator_ops * ops = rdev -> desc -> ops ;
2773
+ int old_uV = _regulator_get_voltage (rdev );
2755
2774
2756
2775
trace_regulator_set_voltage (rdev_get_name (rdev ), min_uV , max_uV );
2757
2776
@@ -2803,23 +2822,37 @@ static int _regulator_do_set_voltage(struct regulator_dev *rdev,
2803
2822
if (ret )
2804
2823
goto out ;
2805
2824
2806
- /* Call set_voltage_time_sel if successfully obtained old_selector */
2807
- if (!old_selector >= 0 && old_selector != selector ) {
2808
- delay = ops -> set_voltage_time_sel (rdev ,
2809
- old_selector , selector );
2810
- if (delay < 0 ) {
2811
- rdev_warn (rdev , "set_voltage_time_sel() failed: %d\n" ,
2812
- delay );
2813
- delay = 0 ;
2825
+ if (ops -> set_voltage_time_sel ) {
2826
+ /*
2827
+ * Call set_voltage_time_sel if successfully obtained
2828
+ * old_selector
2829
+ */
2830
+ if (old_selector >= 0 && old_selector != selector )
2831
+ delay = ops -> set_voltage_time_sel (rdev , old_selector ,
2832
+ selector );
2833
+ } else {
2834
+ if (old_uV != best_val ) {
2835
+ if (ops -> set_voltage_time )
2836
+ delay = ops -> set_voltage_time (rdev , old_uV ,
2837
+ best_val );
2838
+ else
2839
+ delay = _regulator_set_voltage_time (rdev ,
2840
+ old_uV ,
2841
+ best_val );
2814
2842
}
2843
+ }
2815
2844
2816
- /* Insert any necessary delays */
2817
- if (delay >= 1000 ) {
2818
- mdelay (delay / 1000 );
2819
- udelay (delay % 1000 );
2820
- } else if (delay ) {
2821
- udelay (delay );
2822
- }
2845
+ if (delay < 0 ) {
2846
+ rdev_warn (rdev , "failed to get delay: %d\n" , delay );
2847
+ delay = 0 ;
2848
+ }
2849
+
2850
+ /* Insert any necessary delays */
2851
+ if (delay >= 1000 ) {
2852
+ mdelay (delay / 1000 );
2853
+ udelay (delay % 1000 );
2854
+ } else if (delay ) {
2855
+ udelay (delay );
2823
2856
}
2824
2857
2825
2858
if (best_val >= 0 ) {
@@ -3000,9 +3033,13 @@ int regulator_set_voltage_time(struct regulator *regulator,
3000
3033
int voltage ;
3001
3034
int i ;
3002
3035
3036
+ if (ops -> set_voltage_time )
3037
+ return ops -> set_voltage_time (rdev , old_uV , new_uV );
3038
+ else if (!ops -> set_voltage_time_sel )
3039
+ return _regulator_set_voltage_time (rdev , old_uV , new_uV );
3040
+
3003
3041
/* Currently requires operations to do this */
3004
- if (!ops -> list_voltage || !ops -> set_voltage_time_sel
3005
- || !rdev -> desc -> n_voltages )
3042
+ if (!ops -> list_voltage || !rdev -> desc -> n_voltages )
3006
3043
return - EINVAL ;
3007
3044
3008
3045
for (i = 0 ; i < rdev -> desc -> n_voltages ; i ++ ) {
@@ -3041,25 +3078,20 @@ int regulator_set_voltage_time_sel(struct regulator_dev *rdev,
3041
3078
unsigned int old_selector ,
3042
3079
unsigned int new_selector )
3043
3080
{
3044
- unsigned int ramp_delay = 0 ;
3045
3081
int old_volt , new_volt ;
3046
3082
3047
- if (rdev -> constraints -> ramp_delay )
3048
- ramp_delay = rdev -> constraints -> ramp_delay ;
3049
- else if (rdev -> desc -> ramp_delay )
3050
- ramp_delay = rdev -> desc -> ramp_delay ;
3051
-
3052
- if (ramp_delay == 0 )
3053
- return 0 ;
3054
-
3055
3083
/* sanity check */
3056
3084
if (!rdev -> desc -> ops -> list_voltage )
3057
3085
return - EINVAL ;
3058
3086
3059
3087
old_volt = rdev -> desc -> ops -> list_voltage (rdev , old_selector );
3060
3088
new_volt = rdev -> desc -> ops -> list_voltage (rdev , new_selector );
3061
3089
3062
- return DIV_ROUND_UP (abs (new_volt - old_volt ), ramp_delay );
3090
+ if (rdev -> desc -> ops -> set_voltage_time )
3091
+ return rdev -> desc -> ops -> set_voltage_time (rdev , old_volt ,
3092
+ new_volt );
3093
+ else
3094
+ return _regulator_set_voltage_time (rdev , old_volt , new_volt );
3063
3095
}
3064
3096
EXPORT_SYMBOL_GPL (regulator_set_voltage_time_sel );
3065
3097
0 commit comments