/* Write both the fan clock divider (if it changed) and the new
           fan min (unconditionally) */
        if (new_div != data->fan_div[nr]) {
-               if (new_div > data->fan_div[nr])
-                       data->fan[nr] >>= (data->fan_div[nr] - new_div);
-               else
-                       data->fan[nr] <<= (new_div - data->fan_div[nr]);
+               /* Preserve the fan speed reading */
+               if (data->fan[nr] != 0xff) {
+                       if (new_div > data->fan_div[nr])
+                               data->fan[nr] >>= new_div - data->fan_div[nr];
+                       else if (data->fan[nr] & 0x80)
+                               data->fan[nr] = 0xff;
+                       else
+                               data->fan[nr] <<= data->fan_div[nr] - new_div;
+               }
 
                dev_dbg(dev, "fan%u clock divider changed from %u to %u\n",
                        nr + 1, div_from_reg(data->fan_div[nr]),