Changeset 1264 for lm-sensors/trunk/kernel/chips/fscscy.c
- Timestamp:
- 12/12/01 17:56:37 (12 years ago)
- Files:
-
- 1 modified
-
lm-sensors/trunk/kernel/chips/fscscy.c (modified) (20 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lm-sensors/trunk/kernel/chips/fscscy.c
r1227 r1264 2 2 fscscy.c - Part of lm_sensors, Linux kernel modules for hardware 3 3 monitoring 4 Copyright (c) 2001 Hermann Jung <hej@odn.de>4 Copyright (c) 2001 Martin Knoblauch <mkn@teraport.de, knobi@knobisoft.de> 5 5 6 6 This program is free software; you can redistribute it and/or modify … … 85 85 #define FSCSCY_REG_WDOG_CONTROL 0x21 86 86 87 /* 88 ** Fan definitions 89 ** 90 ** _RPMMIN: Minimum speed. Can be set via interface, but only for three of the fans 91 ** FAN1_RPMMIN is wired to Fan 0 (CPU Fans) 92 ** FAN4_RPMMIN is wired to Fan 2 (PS Fans ??) 93 ** FAN5_RPMMIN is wired to Fan 3 (AUX Fans ??) 94 ** _ACT: Actual Fan Speed 95 ** _STATE: Fan status register 96 ** _RIPPLE: Fan speed multiplier 97 */ 98 87 99 /* fan 0 */ 88 #define FSCSCY_REG_FAN0_ MIN 0x65100 #define FSCSCY_REG_FAN0_RPMMIN 0x65 89 101 #define FSCSCY_REG_FAN0_ACT 0x6b 90 102 #define FSCSCY_REG_FAN0_STATE 0x62 … … 92 104 93 105 /* fan 1 */ 94 #define FSCSCY_REG_FAN1_ MIN FSCSCY_REG_FAN0_MIN106 #define FSCSCY_REG_FAN1_RPMMIN FSCSCY_REG_FAN0_RPMMIN 95 107 #define FSCSCY_REG_FAN1_ACT 0x6c 96 108 #define FSCSCY_REG_FAN1_STATE 0x61 … … 98 110 99 111 /* fan 2 */ 100 #define FSCSCY_REG_FAN2_ MIN 0x55112 #define FSCSCY_REG_FAN2_RPMMIN 0x55 101 113 #define FSCSCY_REG_FAN2_ACT 0x0e 102 114 #define FSCSCY_REG_FAN2_STATE 0x0d … … 104 116 105 117 /* fan 3 */ 106 #define FSCSCY_REG_FAN3_ MIN 0xa5118 #define FSCSCY_REG_FAN3_RPMMIN 0xa5 107 119 #define FSCSCY_REG_FAN3_ACT 0xab 108 120 #define FSCSCY_REG_FAN3_STATE 0xa2 … … 110 122 111 123 /* fan 4 */ 112 #define FSCSCY_REG_FAN4_ MIN FSCSCY_REG_FAN2_MIN124 #define FSCSCY_REG_FAN4_RPMMIN FSCSCY_REG_FAN2_RPMMIN 113 125 #define FSCSCY_REG_FAN4_ACT 0x5c 114 126 #define FSCSCY_REG_FAN4_STATE 0x52 … … 116 128 117 129 /* fan 5 */ 118 #define FSCSCY_REG_FAN5_ MIN FSCSCY_REG_FAN3_MIN130 #define FSCSCY_REG_FAN5_RPMMIN FSCSCY_REG_FAN3_RPMMIN 119 131 #define FSCSCY_REG_FAN5_ACT 0xbb 120 132 #define FSCSCY_REG_FAN5_STATE 0xb2 … … 185 197 u8 watchdog[3]; /* watchdog */ 186 198 u8 volt[3]; /* 12, 5, battery current */ 199 u8 volt_min[3]; /* minimum voltages over module "lifetime" */ 200 u8 volt_max[3]; /* maximum voltages over module "lifetime" */ 187 201 u8 temp_act[4]; /* temperature */ 188 202 u8 temp_status[4]; /* status of temp. sensor */ … … 192 206 u8 fan_act[6]; /* fans revolutions per second */ 193 207 u8 fan_status[6]; /* fan status */ 194 u8 fan_ min[6];/* fan min value for rps */208 u8 fan_rpmmin[6]; /* fan min value for rps */ 195 209 u8 fan_ripple[6]; /* divider for rps */ 210 u8 fan_min[6]; /* minimum RPM over module "lifetime" */ 211 u8 fan_max[6]; /* maximum RPM over module "lifetime" */ 196 212 u8 pciload; /* PCILoad value */ 197 213 u8 intr_status; /* Intrusion Status */ … … 461 477 /* read revision from chip */ 462 478 data->revision = fscscy_read_value(client,FSCSCY_REG_REVISION); 463 /* setup missing fan2_min value */464 /* data->fan_min[2] = 0xff; */465 479 466 480 /* Initialize min/max values from chip */ 481 data->fan_min[0] = data->fan_max[0] = fscscy_read_value(client, FSCSCY_REG_FAN0_ACT); 482 data->fan_min[1] = data->fan_max[1] = fscscy_read_value(client, FSCSCY_REG_FAN1_ACT); 483 data->fan_min[2] = data->fan_max[2] = fscscy_read_value(client, FSCSCY_REG_FAN2_ACT); 484 data->fan_min[3] = data->fan_max[3] = fscscy_read_value(client, FSCSCY_REG_FAN3_ACT); 485 data->fan_min[4] = data->fan_max[4] = fscscy_read_value(client, FSCSCY_REG_FAN4_ACT); 486 data->fan_min[4] = data->fan_max[5] = fscscy_read_value(client, FSCSCY_REG_FAN5_ACT); 467 487 data->temp_min[0] = data->temp_max[0] = fscscy_read_value(client, FSCSCY_REG_TEMP0_ACT); 468 488 data->temp_min[1] = data->temp_max[1] = fscscy_read_value(client, FSCSCY_REG_TEMP1_ACT); 469 489 data->temp_min[2] = data->temp_max[2] = fscscy_read_value(client, FSCSCY_REG_TEMP2_ACT); 470 490 data->temp_min[3] = data->temp_max[3] = fscscy_read_value(client, FSCSCY_REG_TEMP3_ACT); 491 data->volt_min[0] = data->volt_max[0] = fscscy_read_value(client, FSCSCY_REG_VOLT_12); 492 data->volt_min[1] = data->volt_max[1] = fscscy_read_value(client, FSCSCY_REG_VOLT_5); 493 data->volt_min[2] = data->volt_max[2] = fscscy_read_value(client, FSCSCY_REG_VOLT_BATT); 471 494 } 472 495 … … 495 518 if (data->temp_min[3] > data->temp_act[3]) data->temp_min[3] = data->temp_act[3]; 496 519 if (data->temp_max[3] < data->temp_act[3]) data->temp_max[3] = data->temp_act[3]; 497 498 520 data->temp_status[0] = fscscy_read_value(client, FSCSCY_REG_TEMP0_STATE); 499 521 data->temp_status[1] = fscscy_read_value(client, FSCSCY_REG_TEMP1_STATE); … … 506 528 507 529 data->volt[0] = fscscy_read_value(client, FSCSCY_REG_VOLT_12); 530 if (data->volt_min[0] > data->volt[0]) data->volt_min[0] = data->volt[0]; 531 if (data->volt_max[0] < data->volt[0]) data->volt_max[0] = data->volt[0]; 508 532 data->volt[1] = fscscy_read_value(client, FSCSCY_REG_VOLT_5); 533 if (data->volt_min[1] > data->volt[1]) data->volt_min[1] = data->volt[1]; 534 if (data->volt_max[1] < data->volt[1]) data->volt_max[1] = data->volt[1]; 509 535 data->volt[2] = fscscy_read_value(client, FSCSCY_REG_VOLT_BATT); 536 if (data->volt_min[2] > data->volt[2]) data->volt_min[2] = data->volt[2]; 537 if (data->volt_max[2] < data->volt[2]) data->volt_max[2] = data->volt[2]; 510 538 511 539 data->fan_act[0] = fscscy_read_value(client, FSCSCY_REG_FAN0_ACT); 540 if (data->fan_min[0] > data->fan_act[0]) data->fan_min[0] = data->fan_act[0]; 541 if (data->fan_max[0] < data->fan_act[0]) data->fan_max[0] = data->fan_act[0]; 512 542 data->fan_act[1] = fscscy_read_value(client, FSCSCY_REG_FAN1_ACT); 543 if (data->fan_min[1] > data->fan_act[1]) data->fan_min[1] = data->fan_act[1]; 544 if (data->fan_max[1] < data->fan_act[1]) data->fan_max[1] = data->fan_act[1]; 513 545 data->fan_act[2] = fscscy_read_value(client, FSCSCY_REG_FAN2_ACT); 546 if (data->fan_min[2] > data->fan_act[2]) data->fan_min[2] = data->fan_act[2]; 547 if (data->fan_max[2] < data->fan_act[2]) data->fan_max[2] = data->fan_act[2]; 514 548 data->fan_act[3] = fscscy_read_value(client, FSCSCY_REG_FAN3_ACT); 549 if (data->fan_min[3] > data->fan_act[3]) data->fan_min[3] = data->fan_act[3]; 550 if (data->fan_max[3] < data->fan_act[3]) data->fan_max[3] = data->fan_act[3]; 515 551 data->fan_act[4] = fscscy_read_value(client, FSCSCY_REG_FAN4_ACT); 552 if (data->fan_min[4] > data->fan_act[4]) data->fan_min[4] = data->fan_act[4]; 553 if (data->fan_max[4] < data->fan_act[4]) data->fan_max[4] = data->fan_act[4]; 516 554 data->fan_act[5] = fscscy_read_value(client, FSCSCY_REG_FAN5_ACT); 555 if (data->fan_min[5] > data->fan_act[5]) data->fan_min[5] = data->fan_act[5]; 556 if (data->fan_max[5] < data->fan_act[5]) data->fan_max[5] = data->fan_act[5]; 517 557 data->fan_status[0] = fscscy_read_value(client, FSCSCY_REG_FAN0_STATE); 518 558 data->fan_status[1] = fscscy_read_value(client, FSCSCY_REG_FAN1_STATE); … … 521 561 data->fan_status[4] = fscscy_read_value(client, FSCSCY_REG_FAN4_STATE); 522 562 data->fan_status[5] = fscscy_read_value(client, FSCSCY_REG_FAN5_STATE); 523 data->fan_ min[0] = fscscy_read_value(client, FSCSCY_REG_FAN0_MIN);524 data->fan_ min[1] = fscscy_read_value(client, FSCSCY_REG_FAN1_MIN);525 data->fan_ min[2] = fscscy_read_value(client, FSCSCY_REG_FAN2_MIN);526 data->fan_ min[3] = fscscy_read_value(client, FSCSCY_REG_FAN3_MIN);527 data->fan_ min[4] = fscscy_read_value(client, FSCSCY_REG_FAN4_MIN);528 data->fan_ min[5] = fscscy_read_value(client, FSCSCY_REG_FAN5_MIN);563 data->fan_rpmmin[0] = fscscy_read_value(client, FSCSCY_REG_FAN0_RPMMIN); 564 data->fan_rpmmin[1] = fscscy_read_value(client, FSCSCY_REG_FAN1_RPMMIN); 565 data->fan_rpmmin[2] = fscscy_read_value(client, FSCSCY_REG_FAN2_RPMMIN); 566 data->fan_rpmmin[3] = fscscy_read_value(client, FSCSCY_REG_FAN3_RPMMIN); 567 data->fan_rpmmin[4] = fscscy_read_value(client, FSCSCY_REG_FAN4_RPMMIN); 568 data->fan_rpmmin[5] = fscscy_read_value(client, FSCSCY_REG_FAN5_RPMMIN); 529 569 data->fan_ripple[0] = fscscy_read_value(client, FSCSCY_REG_FAN0_RIPPLE); 530 570 data->fan_ripple[1] = fscscy_read_value(client, FSCSCY_REG_FAN1_RIPPLE); … … 706 746 case FSCSCY_SYSCTL_VOLT0: 707 747 results[0] = VOLT_FROM_REG(data->volt[0],1420); 748 results[1] = VOLT_FROM_REG(data->volt_min[0],1420); 749 results[2] = VOLT_FROM_REG(data->volt_max[0],1420); 708 750 break; 709 751 case FSCSCY_SYSCTL_VOLT1: 710 752 results[0] = VOLT_FROM_REG(data->volt[1],660); 753 results[1] = VOLT_FROM_REG(data->volt_min[1],660); 754 results[2] = VOLT_FROM_REG(data->volt_max[1],660); 711 755 break; 712 756 case FSCSCY_SYSCTL_VOLT2: 713 757 results[0] = VOLT_FROM_REG(data->volt[2],330); 758 results[1] = VOLT_FROM_REG(data->volt_min[2],330); 759 results[2] = VOLT_FROM_REG(data->volt_max[2],330); 714 760 break; 715 761 default: … … 719 765 return; 720 766 } 721 *nrels_mag = 1;767 *nrels_mag = 3; 722 768 } else if (operation == SENSORS_PROC_REAL_WRITE) { 723 769 printk("fscscy: writing to chip not supported\n"); … … 732 778 case FSCSCY_SYSCTL_FAN0: 733 779 fscscy_fan_internal(client,operation,ctl_name,nrels_mag,results, 734 0,FSCSCY_REG_FAN0_STATE,FSCSCY_REG_FAN0_ MIN,780 0,FSCSCY_REG_FAN0_STATE,FSCSCY_REG_FAN0_RPMMIN, 735 781 FSCSCY_REG_FAN0_RIPPLE); 736 782 break; 737 783 case FSCSCY_SYSCTL_FAN1: 738 784 fscscy_fan_internal(client,operation,ctl_name,nrels_mag,results, 739 1,FSCSCY_REG_FAN1_STATE,FSCSCY_REG_FAN1_ MIN,785 1,FSCSCY_REG_FAN1_STATE,FSCSCY_REG_FAN1_RPMMIN, 740 786 FSCSCY_REG_FAN1_RIPPLE); 741 787 break; 742 788 case FSCSCY_SYSCTL_FAN2: 743 789 fscscy_fan_internal(client,operation,ctl_name,nrels_mag,results, 744 2,FSCSCY_REG_FAN2_STATE,FSCSCY_REG_FAN2_ MIN,790 2,FSCSCY_REG_FAN2_STATE,FSCSCY_REG_FAN2_RPMMIN, 745 791 FSCSCY_REG_FAN2_RIPPLE); 746 792 break; 747 793 case FSCSCY_SYSCTL_FAN3: 748 794 fscscy_fan_internal(client,operation,ctl_name,nrels_mag,results, 749 3,FSCSCY_REG_FAN3_STATE,FSCSCY_REG_FAN3_ MIN,795 3,FSCSCY_REG_FAN3_STATE,FSCSCY_REG_FAN3_RPMMIN, 750 796 FSCSCY_REG_FAN3_RIPPLE); 751 797 break; 752 798 case FSCSCY_SYSCTL_FAN4: 753 799 fscscy_fan_internal(client,operation,ctl_name,nrels_mag,results, 754 4,FSCSCY_REG_FAN4_STATE,FSCSCY_REG_FAN4_ MIN,800 4,FSCSCY_REG_FAN4_STATE,FSCSCY_REG_FAN4_RPMMIN, 755 801 FSCSCY_REG_FAN4_RIPPLE); 756 802 break; 757 803 case FSCSCY_SYSCTL_FAN5: 758 804 fscscy_fan_internal(client,operation,ctl_name,nrels_mag,results, 759 5,FSCSCY_REG_FAN5_STATE,FSCSCY_REG_FAN5_ MIN,805 5,FSCSCY_REG_FAN5_STATE,FSCSCY_REG_FAN5_RPMMIN, 760 806 FSCSCY_REG_FAN5_RIPPLE); 761 807 break; … … 778 824 fscscy_update_client(client); 779 825 results[0] = data->fan_status[nr] & 0x0f; /* MKN */ 780 results[1] = data->fan_ min[nr];826 results[1] = data->fan_rpmmin[nr]; 781 827 results[2] = data->fan_ripple[nr] & 0x03; 782 828 results[3] = RPM_FROM_REG(data->fan_act[nr]); 783 *nrels_mag = 4; 829 results[4] = RPM_FROM_REG(data->fan_min[nr]); 830 results[5] = RPM_FROM_REG(data->fan_max[nr]); 831 *nrels_mag = 6; 784 832 } else if (operation == SENSORS_PROC_REAL_WRITE) { 785 833 if(*nrels_mag >= 1) { 786 data->fan_status[nr] = (data->fan_status[nr] & 0x0b) | results[0] & 0x04; /* MKN */834 data->fan_status[nr] = (data->fan_status[nr] & 0x0b) | (results[0] & 0x04); /* MKN */ 787 835 printk("fscscy: writing value 0x%02x to fan%d_status\n", 788 836 data->fan_status[nr],nr); … … 790 838 data->fan_status[nr]); 791 839 } 792 if((*nrels_mag >= 2) && (nr != 2) && (nr != 4)) { /* MIN Speed for Fan 2/4 is not supported */ 793 data->fan_min[nr] = results[1]; 840 if(*nrels_mag >= 2) { 841 if((results[1] & 0xff) == 0) { 842 printk("fscscy: fan%d rpmmin 0 not allowed for safety reasons\n",nr); 843 return; 844 } 845 data->fan_rpmmin[nr] = results[1]; 794 846 printk("fscscy: writing value 0x%02x to fan%d_min\n", 795 data->fan_ min[nr],nr);847 data->fan_rpmmin[nr],nr); 796 848 fscscy_write_value(client,reg_min, 797 data->fan_ min[nr]);849 data->fan_rpmmin[nr]); 798 850 } 799 851 if(*nrels_mag >= 3) { 800 852 if((results[2] & 0x03) == 0) { 801 printk("fscscy: fan%d ripple 0 not allowed\n",nr);853 printk("fscscy: fan%d ripple 0 is nonsense/not allowed\n",nr); 802 854 return; 803 855 } … … 860 912 *nrels_mag = 1; 861 913 } else if (operation == SENSORS_PROC_REAL_WRITE) { 862 printk("fscscy: writing to chip not supported\n");914 printk("fscscy: writing PCILOAD to chip not supported\n"); 863 915 } 864 916 } … … 924 976 925 977 MODULE_AUTHOR 926 (" Hermann Jung <hej@odn.de> based on work from Frodo Looijaard <frodol@dds.nl> and Philip Edelbrock <phil@netroedge.com>");978 ("Martin Knoblauch <mkn@teraport.de> based on work (fscpos) from Hermann Jung <hej@odn.de>"); 927 979 MODULE_DESCRIPTION("fujitsu siemens scylla chip driver"); 928 980
