]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
drivers: thermal: enable fan regulater when needed
authorTerry Wang <terwang@nvidia.com>
Mon, 2 Mar 2015 16:07:51 +0000 (16:07 +0000)
committerHayden Du <haydend@nvidia.com>
Fri, 10 Apr 2015 02:56:14 +0000 (19:56 -0700)
Only enable vdd-fan regulator before fan start spin for power saving
Disable vdd-fan regulator when next fan pwm is 0.

bug 200069439

Change-Id: If5e0c35472478e6197bb37ef2af52b540d855fc9
Signed-off-by: Terry Wang <terwang@nvidia.com>
Reviewed-on: http://git-master/r/691938
GVS: Gerrit_Virtual_Submit
Reviewed-by: Anshul Jain (SW) <anshulj@nvidia.com>
Reviewed-by: Raymond Poudrier <rapoudrier@nvidia.com>
(cherry picked from commit bc6092007fc42d7201f4520e0f0ae2d555dfe1a4)
Reviewed-on: http://git-master/r/714766
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/727271
Reviewed-by: Jiukai Ma <jiukaim@nvidia.com>
Tested-by: Jiukai Ma <jiukaim@nvidia.com>
drivers/thermal/pwm_fan.c

index 5dc875d97cd932a1ef611d203555d98490b39c74..78a6d5d314af171e791e13806d648ccd37712ffc 100644 (file)
@@ -470,7 +470,7 @@ static int get_next_lower_pwm(int pwm, struct fan_dev_data *fan_data)
 
 static void fan_ramping_work_func(struct work_struct *work)
 {
-       int rru, rrd;
+       int rru, rrd, err;
        int cur_pwm, next_pwm;
        struct delayed_work *dwork = container_of(work, struct delayed_work,
                                                                        work);
@@ -501,6 +501,26 @@ static void fan_ramping_work_func(struct work_struct *work)
                next_pwm = max(next_pwm, fan_data->next_target_pwm);
                next_pwm = max(0, next_pwm);
        }
+
+       if ((next_pwm != 0) && !(regulator_is_enabled(fan_data->fan_reg))) {
+               err = regulator_enable(fan_data->fan_reg);
+               if (err < 0)
+                       dev_err(fan_data->dev,
+                               " Coudn't enable vdd-fan\n");
+               else
+                       dev_info(fan_data->dev,
+                               " Enabled vdd-fan\n");
+       }
+       if ((next_pwm == 0) && (regulator_is_enabled(fan_data->fan_reg))) {
+               err = regulator_disable(fan_data->fan_reg);
+               if (err < 0)
+                       dev_err(fan_data->dev,
+                               " Couldn't disable vdd-fan\n");
+               else
+                       dev_info(fan_data->dev,
+                               " Disabled vdd-fan\n");
+       }
+
        set_pwm_duty_cycle(next_pwm, fan_data);
        fan_data->fan_cur_pwm = next_pwm;
        if (fan_data->next_target_pwm != next_pwm)
@@ -929,12 +949,6 @@ static int pwm_fan_probe(struct platform_device *pdev)
                        fan_data->fan_state_cap_lookup[i]);
        }
 
-       err = regulator_enable(fan_data->fan_reg);
-       if (err < 0)
-               dev_err(&pdev->dev, " Coudn't enable regulator\n");
-       else
-               dev_info(&pdev->dev, " Enabled regulator\n");
-
        return err;
 
 sysfs_fail:
@@ -1044,10 +1058,6 @@ static int pwm_fan_resume(struct platform_device *pdev)
        /*Start thermal control*/
        fan_data->fan_temp_control_flag = 1;
 
-       err = regulator_enable(fan_data->fan_reg);
-       if (err < 0)
-               dev_err(&pdev->dev, "Not able to enable Fan regulator\n");
-
        mutex_unlock(&fan_data->fan_state_lock);
        return 0;
 }