| | 764 | static void pc87360_autodiv(struct pc87360_data *data, int nr) |
| | 765 | { |
| | 766 | /* Increase clock divider if needed and possible */ |
| | 767 | if ((data->fan_status[nr] & 0x04) /* overflow flag */ |
| | 768 | || (data->fan[nr] >= 224)) { /* next to overflow */ |
| | 769 | if ((data->fan_status[nr] & 0x60) != 0x60) { |
| | 770 | data->fan_status[nr] += 0x20; |
| | 771 | data->fan_min[nr] >>= 1; |
| | 772 | data->fan[nr] >>= 1; |
| | 773 | pc87360_write_value(data, LD_FAN, NO_BANK, |
| | 774 | PC87360_REG_FAN_MIN(nr), |
| | 775 | data->fan_min[nr]); |
| | 776 | #ifdef DEBUG |
| | 777 | printk(KERN_DEBUG "pc87360.o: Increasing " |
| | 778 | "clock divider to %d for fan %d\n", |
| | 779 | FAN_DIV_FROM_REG(data->fan_status[nr]), |
| | 780 | nr+1); |
| | 781 | #endif |
| | 782 | } |
| | 783 | } else |
| | 784 | /* Decrease clock divider if needed and possible */ |
| | 785 | if (data->fan[nr] < 85 /* bad accuracy */ |
| | 786 | && !(data->fan_min[nr] & 0x80)) { |
| | 787 | if ((data->fan_status[nr] & 0x60) != 0x00) { |
| | 788 | data->fan_status[nr] -= 0x20; |
| | 789 | data->fan_min[nr] <<= 1; |
| | 790 | data->fan[nr] <<= 1; |
| | 791 | pc87360_write_value(data, LD_FAN, NO_BANK, |
| | 792 | PC87360_REG_FAN_MIN(nr), |
| | 793 | data->fan_min[nr]); |
| | 794 | #ifdef DEBUG |
| | 795 | printk(KERN_DEBUG "pc87360.o: Decreasing " |
| | 796 | "clock divider to %d for fan %d\n", |
| | 797 | FAN_DIV_FROM_REG(data->fan_status[nr]), |
| | 798 | nr+1); |
| | 799 | #endif |
| | 800 | } |
| | 801 | } |
| | 802 | } |
| | 803 | |
| 788 | | /* Increase clock divider if needed */ |
| 789 | | if ((data->fan_status[i] & 0x60) != 0x60 |
| 790 | | && ((data->fan_status[i] & 0x04) |
| 791 | | || (data->fan[i] & 0xE0) == 0xE0)) { |
| 792 | | data->fan_status[i] += 0x20; |
| 793 | | data->fan_min[i] >>= 1; |
| 794 | | data->fan[i] >>= 1; |
| 795 | | pc87360_write_value(data, LD_FAN, NO_BANK, |
| 796 | | PC87360_REG_FAN_MIN(i), |
| 797 | | data->fan_min[i]); |
| 798 | | #ifdef DEBUG |
| 799 | | printk(KERN_DEBUG "pc87360.o: Increasing " |
| 800 | | "clock divider to %d for fan %d\n", |
| 801 | | FAN_DIV_FROM_REG(data->fan_status[i]), |
| 802 | | i+1); |
| 803 | | #endif |
| 804 | | } else |
| 805 | | /* Decrease clock divider if possible */ |
| 806 | | if ((data->fan_status[i] & 0x60) != 0x00 |
| 807 | | && !(data->fan_status[i] & 0x04) |
| 808 | | && data->fan[i] <= 0x50) { |
| 809 | | data->fan_status[i] -= 0x20; |
| 810 | | data->fan_min[i] = (data->fan_min[i] & 0x80) |
| 811 | | ? 255 : |
| 812 | | (data->fan_min[i] << 1); |
| 813 | | data->fan[i] <<= 1; |
| 814 | | pc87360_write_value(data, LD_FAN, NO_BANK, |
| 815 | | PC87360_REG_FAN_MIN(i), |
| 816 | | data->fan_min[i]); |
| 817 | | #ifdef DEBUG |
| 818 | | printk(KERN_DEBUG "pc87360.o: Decreasing " |
| 819 | | "clock divider to %d for fan %d\n", |
| 820 | | FAN_DIV_FROM_REG(data->fan_status[i]), |
| 821 | | i+1); |
| 822 | | #endif |
| 823 | | } |
| | 828 | /* Change clock divider if needed */ |
| | 829 | pc87360_autodiv(data, i); |
| 934 | | data->fan_min[nr] = FAN_TO_REG(results[0], |
| 935 | | FAN_DIV_FROM_REG(data->fan_status[nr])); |
| | 940 | int fan_min = FAN_TO_REG(results[0], |
| | 941 | FAN_DIV_FROM_REG(data->fan_status[nr])); |
| | 942 | /* If it wouldn't fit, change clock divisor */ |
| | 943 | while (fan_min > 255 |
| | 944 | && (data->fan_status[nr] & 0x60) != 0x60) { |
| | 945 | fan_min >>= 1; |
| | 946 | data->fan[nr] >>= 1; |
| | 947 | data->fan_status[nr] += 0x20; |
| | 948 | } |
| | 949 | data->fan_min[nr] = fan_min > 255 ? 255 : fan_min; |