linux/drivers/macintosh/windfarm_pm81.c
<<
1/spa v 1spa class="lxr_search"> ="+search" method="post" onsubmit="return do_search(this);"> "> Search 1/spa v ="ajax+*" method="post" onsubmit="return false;"> 1input typ hidden" nam ajax_lookup" id ajax_lookup" on> ">
v 1div id file_contents"
. .11/a>1spa  class="comment">/*1/spa  v. .21/a>1spa  class="comment"> * Windfarm PowerMac thermal control. iMac G51/spa  v. .31/a>1spa  class="comment"> *1/spa  v. .41/a>1spa  class="comment"> * (c) Copyright 2005 Benjamin Herrenschmidt, IBM Corp.1/spa  v. .51/a>1spa  class="comment"> *                    <benh@kernel.crashing.org>1/spa  v. .61/a>1spa  class="comment"> *1/spa  v. .71/a>1spa  class="comment"> * Released under the term of the GNU GPLon2v1/spa  v. .81/a>1spa  class="comment"> *1/spa  v. .91/a>1spa  class="comment"> * The algorithm used is the PID control algorithm, used the sam 1/spa  v. 14"
a>1spa  class="comment"> * way the published Darwin code does, using the sam  on>
 s that1/spa  v. 111/a>1spa  class="comment"> * are present in the Darwin 8.2 snapshot property lists (note however1/spa  v. 121/a>1spa  class="comment"> * that none of the code has been re-used, it's a complete re-implementa >
 1/spa  v. 131/a>1spa  class="comment"> *1/spa  v. 141/a>1spa  class="comment"> * The various control loops found in Darwin config file are:1/spa  v. 151/a>1spa  class="comment"> *1/spa  v. 161/a>1spa  class="comment"> * PowerMac8,1 and PowerMac8,21/spa  v. 171/a>1spa  class="comment"> * ===========================1/spa  v. 181/a>1spa  class="comment"> *1/spa  v. 191/a>1spa  class="comment"> * System Fans control loop. Different based ptimodels. In addi/optito the1/spa  v. 24"
a>1spa  class="comment"> * usual PID algorithm, the control loop gets 2 addi/optal pairs of linear1/spa  v. 211/a>1spa  class="comment"> * scaling fac ors (scale/offsets) expressed as 4.16 fixed point on>
 s1/spa  v. 221/a>1spa  class="comment"> * signed pffset, unsigned scale)1/spa  v. 231/a>1spa  class="comment"> *1/spa  v. 241/a>1spa  class="comment"> * The targets are modified such as:1/spa  v. 251/a>1spa  class="comment"> *  - the linked control (second control) gets the target on>
  as-is1/spa  v. 261/a>1spa  class="comment"> *    (typically the drive fan)1/spa  v. 271/a>1spa  class="comment"> *  - the main control (first control) gets the target on>
  scaled with1/spa  v. 281/a>1spa  class="comment"> *    the first pair of fac ors, and is then modified as below1/spa  v. 291/a>1spa  class="comment"> *  - the on>
  of the target of the CPU Fan control loop is retrieved,1/spa  v. 34"
a>1spa  class="comment"> *    scaled with the second pair of fac ors, and the max of that and1/spa  v. 311/a>1spa  class="comment"> *    the scaled target is applied to the main controlv1/spa  v. 321/a>1spa  class="comment"> *1/spa  v. 331/a>1spa  class="comment"> * #imodel_id: 21/spa  v. 341/a>1spa  class="comment"> *   controls       : system-fan, drive-bay-fan1/spa  v. 351/a>1spa  class="comment"> *   sensors        : hd-temp1/spa  v. 361/a>1spa  class="comment"> *   PID params     : G_d = 0x154000001/spa  v. 371/a>1spa  class="comment"> *                    G_p = 0x002000001/spa  v. 381/a>1spa  class="comment"> *                    G_r = 0x000002fd1/spa  v. 391/a>1spa  class="comment"> *                    His ory = 2 entries1/spa  v. 44"
a>1spa  class="comment"> *                    Input target = 0x3a00001/spa  v. 411/a>1spa  class="comment"> *                    Interon> = 5s1/spa  v. 421/a>1spa  class="comment"> *   linear-fac ors : pffset = 0xff38 scale  = 0x0ccd1/spa  v. 431/a>1spa  class="comment"> *                    pffset = 0x0208 scale  = 0x07ae1/spa  v. 441/a>1spa  class="comment"> *1/spa  v. 451/a>1spa  class="comment"> * #imodel_id: 31/spa  v. 461/a>1spa  class="comment"> *   controls       : system-fan, drive-bay-fan1/spa  v. 471/a>1spa  class="comment"> *   sensors        : hd-temp1/spa  v. 481/a>1spa  class="comment"> *   PID params     : G_d = 0x08e000001/spa  v. 491/a>1spa  class="comment"> *                    G_p = 0x005666661/spa  v. 54"
a>1spa  class="comment"> *                    G_r = 0x0000072b1/spa  v. 511/a>1spa  class="comment"> *                    His ory = 2 entries1/spa  v. 521/a>1spa  class="comment"> *                    Input target = 0x3500001/spa  v. 531/a>1spa  class="comment"> *                    Interon> = 5s1/spa  v. 541/a>1spa  class="comment"> *   linear-fac ors : pffset = 0xff38 scale  = 0x0ccd1/spa  v. 551/a>1spa  class="comment"> *                    pffset = 0x0000 scale  = 0x00001/spa  v. 561/a>1spa  class="comment"> *1/spa  v. 571/a>1spa  class="comment"> * #imodel_id: 51/spa  v. 581/a>1spa  class="comment"> *   controls       : system-fan1/spa  v. 591/a>1spa  class="comment"> *   sensors        : hd-temp1/spa  v. 64"
a>1spa  class="comment"> *   PID params     : G_d = 0x154000001/spa  v. 611/a>1spa  class="comment"> *                    G_p = 0x002333331/spa  v. 621/a>1spa  class="comment"> *                    G_r = 0x000002fd1/spa  v. 631/a>1spa  class="comment"> *                    His ory = 2 entries1/spa  v. 641/a>1spa  class="comment"> *                    Input target = 0x3a00001/spa  v. 651/a>1spa  class="comment"> *                    Interon> = 5s1/spa  v. 661/a>1spa  class="comment"> *   linear-fac ors : pffset = 0x0000 scale  = 0x10001/spa  v. 671/a>1spa  class="comment"> *                    pffset = 0x0091 scale  = 0x0bae1/spa  v. 681/a>1spa  class="comment"> *1/spa  v. 691/a>1spa  class="comment"> * CPU Fan control loop. The loop is identical for allimodels. it1/spa  v. 74"
a>1spa  class="comment"> * has an addi/optal pair of scaling fac or. This is used to scale the1/spa  v. 711/a>1spa  class="comment"> * systems fan control loop target result (the one before it gets scaled1/spa  v. 721/a>1spa  class="comment"> * by the System Fans control loop itself). Then, the max on>
  of the1/spa  v. 731/a>1spa  class="comment"> * calculated target on>
  and system fan on>
  is sent to the fans1/spa  v. 741/a>1spa  class="comment"> *1/spa  v. 751/a>1spa  class="comment"> *   controls       : cpu-fan1/spa  v. 761/a>1spa  class="comment"> *   sensors        : cpu-temp cpu-power1/spa  v. 771/a>1spa  class="comment"> *   PID params     : From SMU sdb parti >
 1/spa  v. 781/a>1spa  class="comment"> *   linear-fac ors : pffset = 0xfb50 scale  = 0x10001/spa  v. 791/a>1spa  class="comment"> *1/spa  v. 84"
a>1spa  class="comment"> * CPU Slew control loop. Not implemented. The cpufreq driver in linux is1/spa  v. 811/a>1spa  class="comment"> * completely separate for now, though we could find a way to link it, either1/spa  v. 821/a>1spa  class="comment"> * as a client reac >ng to overtemp notifica >
 s, or directling moni oring1/spa  v. 831/a>1spa  class="comment"> * the CPU temperature1/spa  v. 841/a>1spa  class="comment"> *1/spa  v. 851/a>1spa  class="comment"> * WARNING ! The CPU control loop requires the CPU tmax for the current1/spa  v. 861/a>1spa  class="comment"> * operating point. However, we currently are completely separated from1/spa  v. 871/a>1spa  class="comment"> * the cpufreq driver and thus do not know what the current operating1/spa  v. 881/a>1spa  class="comment"> * point is. Fortunately, we also do not hav  any hardware supporting anything1/spa  v. 891/a>1spa  class="comment"> * but operating point 0 at the moment, thus we just peek that on>
  directly1/spa  v. 94"
a>1spa  class="comment"> * from the SDB parti >
 . If we ever end up with ac ually slewing the system1/spa  v. 911/a>1spa  class="comment"> * clock and thus changing operating points, we'llihav  to find a way to1/spa  v. 921/a>1spa  class="comment"> * communica e with the CPU freq driver;1/spa  v. 931/a>1spa  class="comment"> *1/spa  v. 941/a>1spa  class="comment"> */1/spa  v. 951/a>v. 961/a>#include <linux/typ s.h1/a>>v. 971/a>#include <linux/errno.h1/a>>v. 981/a>#include <linux/kernel.h1/a>>v. 991/a>#include <linux/delay.h1/a>>v.1001/a>#include <linux/slab.h1/a>>v.1011/a>#include <linux/ini .h1/a>>v.1021/a>#include <linux/spinlock.h1/a>>v.1031/a>#include <linux/wai .h1/a>>v.1041/a>#include <linux/kmod.h1/a>>v.1051/a>#include <linux/device.h1/a>>v.1061/a>#include <linux/platform_device.h1/a>>v.1071/a>#include <asm/prom.h1/a>>v.1081/a>#include <asm/machdep.h1/a>>v.1091/a>#include <asm/io.h1/a>>v.1101/a>#include <asm/sec >
 s.h1/a>>v.1111/a>#include <asm/smu.h1/a>>v.1121/a>v.1131/a>#include "windfarm.h1/a>"v.1141/a>#include "windfarm_pid.h1/a>"v.1151/a>v.1161/a>#define.1a href="+code=VERSION" class="sref">VERSION1/a> 1spa  class="string">"0.4".1171/a>v.1181/a>#undef.1a href="+code=DEBUG" class="sref">DEBUG1/a>v.1191/a>v.1201/a>#ifdef.1a href="+code=DEBUG" class="sref">DEBUG1/a>v.1211/a>#define.1a href="+code=DBG" class="sref">DBG1/a>(1a href="+code=args" class="sref">args1/a>...)    1a href="+code=printk" class="sref">printk1/a>(1a href="+code=args" class="sref">args1/a>)v.1221/a>#elsev.1231/a>#define.1a href="+code=DBG" class="sref">DBG1/a>(1a href="+code=args" class="sref">args1/a>...)    do { } while(0)v.1241/a>#endifv.1251/a>v.1261/a>1spa  class="comment">/* define.this to force CPU overtemp to 74 degree, useful for testing1/spa  v.1271/a>1spa  class="comment"> * the overtemp code1/spa  v.1281/a>1spa  class="comment"> */1/spa  v.1291/a>#undef.1a href="+code=HACKED_OVERTEMP" class="sref">HACKED_OVERTEMP1/a>v.134"
a>v.1311/a>static int 1a href="+code=wf_smu_mach_model" class="sref">wf_smu_mach_model1/a>;   1spa  class="comment">/* machine.model id */1/spa  v.1321/a>v.1331/a>1spa  class="comment">/* Controls & sensors */1/spa  v.1341/a>static struct 1a href="+code=wf_sensor" class="sref">wf_sensor1/a> *1a href="+code=sensor_cpu_power" class="sref">sensor_cpu_power1/a>;v.1351/a>static struct 1a href="+code=wf_sensor" class="sref">wf_sensor1/a> *1a href="+code=sensor_cpu_temp" class="sref">sensor_cpu_temp1/a>;v.1361/a>static struct 1a href="+code=wf_sensor" class="sref">wf_sensor1/a> *1a href="+code=sensor_hd_temp" class="sref">sensor_hd_temp1/a>;v.1371/a>static struct 1a href="+code=wf_control" class="sref">wf_control1/a> *1a href="+code=fan_cpu_main" class="sref">fan_cpu_main1/a>;v.1381/a>static struct 1a href="+code=wf_control" class="sref">wf_control1/a> *1a href="+code=fan_hd" class="sref">fan_hd1/a>;v.1391/a>static struct 1a href="+code=wf_control" class="sref">wf_control1/a> *1a href="+code=fan_system" class="sref">fan_system1/a>;v.144"
a>static struct 1a href="+code=wf_control" class="sref">wf_control1/a> *1a href="+code=cpufreq_clamp" class="sref">cpufreq_clamp1/a>;v.1411/a>v.1421/a>1spa  class="comment">/* Set to kick the control loop into life */1/spa  v.1431/a>static int 1a href="+code=wf_smu_all_controls_ok" class="sref">wf_smu_all_controls_ok1/a>, 1a href="+code=wf_smu_all_sensors_ok" class="sref">wf_smu_all_sensors_ok1/a>, 1a href="+code=wf_smu_started" class="sref">wf_smu_started1/a>;v.1441/a>v.1451/a>1spa  class="comment">/* Failure handling.. could be nicer */1/spa  v.1461/a>#define.1a href="+code=FAILURE_FAN" class="sref">FAILURE_FAN1/a>             0x01v.1471/a>#define.1a href="+code=FAILURE_SENSOR" class="sref">FAILURE_SENSOR1/a>          0x02v.1481/a>#define.1a href="+code=FAILURE_OVERTEMP" class="sref">FAILURE_OVERTEMP1/a>        0x04v.1491/a>v.154"
a>static unsigned int 1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failure_state1/a>;v.1511/a>static int 1a href="+code=wf_smu_readjust" class="sref">wf_smu_readjust1/a>, 1a href="+code=wf_smu_skipping" class="sref">wf_smu_skipping1/a>;v.1521/a>static 1a href="+code=bool" class="sref">bool1/a> 1a href="+code=wf_smu_overtemp" class="sref">wf_smu_overtemp1/a>;v.1531/a>v.1541/a>1spa  class="comment">/*1/spa  v.1551/a>1spa  class="comment"> * ****** System Fans Control Loop ******1/spa  v.1561/a>1spa  class="comment"> *1/spa  v.1571/a>1spa  class="comment"> */1/spa  v.1581/a>v.1591/a>1spa  class="comment">/* Parameters for the System Fans control loop. Parameters1/spa  v.164"
a>1spa  class="comment"> * not in this table such as interon>, his ory size, ..v1/spa  v.1611/a>1spa  class="comment"> * are commptito allivers>
 s and thus hard coded for nowv1/spa  v.1621/a>1spa  class="comment"> */1/spa  v.1631/a>struct 1a href="+code=wf_smu_sys_fans_param" class="sref">wf_smu_sys_fans_param1/a> {v.1641/a>        int     1a href="+code=model_id" class="sref">model_id1/a>;v.1651/a>        1a href="+code=s32" class="sref">s321/a>     1a href="+code=itarget" class="sref">itarget1/a>;v.1661/a>        1a href="+code=s32" class="sref">s321/a>     1a href="+code=gd" class="sref">gd1/a>, 1a href="+code=gp" class="sref">gp1/a>, 1a href="+code=gr" class="sref">gr1/a>;v.1671/a>v.1681/a>        1a href="+code=s16" class="sref">s161/a>     1a href="+code=pffset0" class="sref">pffset01/a>;v.1691/a>        1a href="+code=u16" class="sref">u161/a>     1a href="+code=scale0" class="sref">scale01/a>;v.174"
a>        1a href="+code=s16" class="sref">s161/a>     1a href="+code=pffset1" class="sref">pffset11/a>;v.1711/a>        1a href="+code=u16" class="sref">u161/a>     1a href="+code=scale1" class="sref">scale11/a>;v.1721/a>};v.1731/a>v.1741/a>#define.1a href="+code=WF_SMU_SYS_FANS_INTERVAL" class="sref">WF_SMU_SYS_FANS_INTERVAL1/a>        5v.1751/a>#define.1a href="+code=WF_SMU_SYS_FANS_HISTORY_SIZE" class="sref">WF_SMU_SYS_FANS_HISTORY_SIZE1/a>    2v.1761/a>v.1771/a>1spa  class="comment">/* State data used by the system fans control loop1/spa  v.1781/a>1spa  class="comment"> */1/spa  v.1791/a>struct 1a href="+code=wf_smu_sys_fans_state" class="sref">wf_smu_sys_fans_state1/a> {v.184"
a>        int                     1a href="+code=ticks" class="sref">ticks1/a>;v.1811/a>        1a href="+code=s32" class="sref">s321/a>                     1a href="+code=sys_setpoint" class="sref">sys_setpoint1/a>;v.1821/a>        1a href="+code=s32" class="sref">s321/a>                     1a href="+code=hd_setpoint" class="sref">hd_setpoint1/a>;v.1831/a>        1a href="+code=s16" class="sref">s161/a>                     1a href="+code=pffset0" class="sref">pffset01/a>;v.1841/a>        1a href="+code=u16" class="sref">u161/a>                     1a href="+code=scale0" class="sref">scale01/a>;v.1851/a>        1a href="+code=s16" class="sref">s161/a>                     1a href="+code=pffset1" class="sref">pffset11/a>;v.1861/a>        1a href="+code=u16" class="sref">u161/a>                     1a href="+code=scale1" class="sref">scale11/a>;v.1871/a>        struct 1a href="+code=wf_pid_state" class="sref">wf_pid_state1/a>     1a href="+code=pid" class="sref">pid1/a>;v.1881/a>};v.1891/a>v.194"
a>1spa  class="comment">/*1/spa  v.1911/a>1spa  class="comment"> * Configs for SMU System Fan control loop1/spa  v.1921/a>1spa  class="comment"> */1/spa  v.1931/a>static struct 1a href="+code=wf_smu_sys_fans_param" class="sref">wf_smu_sys_fans_param1/a> 1a href="+code=wf_smu_sys_all_params" class="sref">wf_smu_sys_all_params1/a>[] = {v.1941/a>        1spa  class="comment">/* Model ID 2 */1/spa  v.1951/a>        {v.1961/a>                .1a href="+code=model_id" class="sref">model_id1/a>       = 2,v.1971/a>                .1a href="+code=itarget" class="sref">itarget1/a>        = 0x3a0000,v.1981/a>                .1a href="+code=gd" class="sref">gd1/a>             = 0x15400000,v.1991/a>                .1a href="+code=gp" class="sref">gp1/a>             = 0x00200000,v.2001/a>                .1a href="+code=gr" class="sref">gr1/a>             = 0x000002fd,v.2011/a>                .1a href="+code=pffset0" class="sref">pffset01/a>        = 0xff38,v.2021/a>                .1a href="+code=scale0" class="sref">scale01/a>         = 0x0ccd,v.2031/a>                .1a href="+code=pffset1" class="sref">pffset11/a>        = 0x0208,v.2041/a>                .1a href="+code=scale1" class="sref">scale11/a>         = 0x07ae,v.2051/a>        },v.2061/a>        1spa  class="comment">/* Model ID 3 */1/spa  v.2071/a>        {v.2081/a>                .1a href="+code=model_id" class="sref">model_id1/a>       = 3,v.2091/a>                .1a href="+code=itarget" class="sref">itarget1/a>        = 0x350000,v.2101/a>                .1a href="+code=gd" class="sref">gd1/a>             = 0x08e00000,v.2111/a>                .1a href="+code=gp" class="sref">gp1/a>             = 0x00566666,v.2121/a>                .1a href="+code=gr" class="sref">gr1/a>             = 0x0000072b,v.2131/a>                .1a href="+code=pffset0" class="sref">pffset01/a>        = 0xff38,v.2141/a>                .1a href="+code=scale0" class="sref">scale01/a>         = 0x0ccd,v.2151/a>                .1a href="+code=pffset1" class="sref">pffset11/a>        = 0x0000,v.2161/a>                .1a href="+code=scale1" class="sref">scale11/a>         = 0x0000,v.2171/a>        },v.2181/a>        1spa  class="comment">/* Model ID 5 */1/spa  v.2191/a>        {v.2201/a>                .1a href="+code=model_id" class="sref">model_id1/a>       = 5,v.2211/a>                .1a href="+code=itarget" class="sref">itarget1/a>        = 0x3a0000,v.2221/a>                .1a href="+code=gd" class="sref">gd1/a>             = 0x15400000,v.2231/a>                .1a href="+code=gp" class="sref">gp1/a>             = 0x00233333,v.2241/a>                .1a href="+code=gr" class="sref">gr1/a>             = 0x000002fd,v.2251/a>                .1a href="+code=pffset0" class="sref">pffset01/a>        = 0x0000,v.2261/a>                .1a href="+code=scale0" class="sref">scale01/a>         = 0x1000,v.2271/a>                .1a href="+code=pffset1" class="sref">pffset11/a>        = 0x0091,v.2281/a>                .1a href="+code=scale1" class="sref">scale11/a>         = 0x0bae,v.2291/a>        },v.234"
a>};v.2311/a>#define.1a href="+code=WF_SMU_SYS_FANS_NUM_CONFIGS" class="sref">WF_SMU_SYS_FANS_NUM_CONFIGS1/a> 1a href="+code=ARRAY_SIZE" class="sref">ARRAY_SIZE1/a>(1a href="+code=wf_smu_sys_all_params" class="sref">wf_smu_sys_all_params1/a>)v.2321/a>v.2331/a>static struct 1a href="+code=wf_smu_sys_fans_state" class="sref">wf_smu_sys_fans_state1/a> *1a href="+code=wf_smu_sys_fans" class="sref">wf_smu_sys_fans1/a>;v.2341/a>v.2351/a>1spa  class="comment">/*1/spa  v.2361/a>1spa  class="comment"> * ****** CPU Fans Control Loop ******1/spa  v.2371/a>1spa  class="comment"> *1/spa  v.2381/a>1spa  class="comment"> */1/spa  v.2391/a>v.244"
a>v.2411/a>#define.1a href="+code=WF_SMU_CPU_FANS_INTERVAL" class="sref">WF_SMU_CPU_FANS_INTERVAL1/a>        1v.2421/a>#define.1a href="+code=WF_SMU_CPU_FANS_MAX_HISTORY" class="sref">WF_SMU_CPU_FANS_MAX_HISTORY1/a>     16v.2431/a>#define.1a href="+code=WF_SMU_CPU_FANS_SIBLING_SCALE" class="sref">WF_SMU_CPU_FANS_SIBLING_SCALE1/a>   0x00001000v.2441/a>#define.1a href="+code=WF_SMU_CPU_FANS_SIBLING_OFFSET" class="sref">WF_SMU_CPU_FANS_SIBLING_OFFSET1/a>  0xfffffb50v.2451/a>v.2461/a>1spa  class="comment">/* State data used by the cpu fans control loop1/spa  v.2471/a>1spa  class="comment"> */1/spa  v.2481/a>struct 1a href="+code=wf_smu_cpu_fans_state" class="sref">wf_smu_cpu_fans_state1/a> {v.2491/a>        int                     1a href="+code=ticks" class="sref">ticks1/a>;v.254"
a>        1a href="+code=s32" class="sref">s321/a>                     1a href="+code=cpu_setpoint" class="sref">cpu_setpoint1/a>;v.2511/a>        1a href="+code=s32" class="sref">s321/a>                     1a href="+code=scale" class="sref">scale1/a>;v.2521/a>        1a href="+code=s32" class="sref">s321/a>                     1a href="+code=pffset" class="sref">pffset1/a>;v.2531/a>        struct 1a href="+code=wf_cpu_pid_state" class="sref">wf_cpu_pid_state1/a> 1a href="+code=pid" class="sref">pid1/a>;v.2541/a>};v.2551/a>v.2561/a>static struct 1a href="+code=wf_smu_cpu_fans_state" class="sref">wf_smu_cpu_fans_state1/a> *1a href="+code=wf_smu_cpu_fans" class="sref">wf_smu_cpu_fans1/a>;v.2571/a>v.2581/a>v.2591/a>v.264"
a>1spa  class="comment">/*1/spa  v.2611/a>1spa  class="comment"> * ***** Implementa >
  *****1/spa  v.2621/a>1spa  class="comment"> *1/spa  v.2631/a>1spa  class="comment"> */1/spa  v.2641/a>v.2651/a>static void 1a href="+code=wf_smu_create_sys_fans" class="sref">wf_smu_create_sys_fans1/a>(void)v.2661/a>{v.2671/a>        struct 1a href="+code=wf_smu_sys_fans_param" class="sref">wf_smu_sys_fans_param1/a> *1a href="+code=param" class="sref">param1/a> = 1a href="+code=NULL" class="sref">NULL1/a>;v.2681/a>        struct 1a href="+code=wf_pid_param" class="sref">wf_pid_param1/a> 1a href="+code=pid_param" class="sref">pid_param1/a>;v.2691/a>        int 1a href="+code=i" class="sref">i1/a>;v.274"
a>v.2711/a>        1spa  class="comment">/* First, loca e the params for this.model */1/spa  v.2721/a>        for (1a href="+code=i" class="sref">i1/a> = 0; 1a href="+code=i" class="sref">i1/a> <.1a href="+code=WF_SMU_SYS_FANS_NUM_CONFIGS" class="sref">WF_SMU_SYS_FANS_NUM_CONFIGS1/a>; 1a href="+code=i" class="sref">i1/a>++)v.2731/a>                if (1a href="+code=wf_smu_sys_all_params" class="sref">wf_smu_sys_all_params1/a>[1a href="+code=i" class="sref">i1/a>].1a href="+code=model_id" class="sref">model_id1/a> == 1a href="+code=wf_smu_mach_model" class="sref">wf_smu_mach_model1/a>) {v.2741/a>                        1a href="+code=param" class="sref">param1/a> = &1a href="+code=wf_smu_sys_all_params" class="sref">wf_smu_sys_all_params1/a>[1a href="+code=i" class="sref">i1/a>];v.2751/a>                        break;v.2761/a>                }v.2771/a>v.2781/a>        1spa  class="comment">/* No params found, put fans to max */1/spa  v.2791/a>        if (1a href="+code=param" class="sref">param1/a> == 1a href="+code=NULL" class="sref">NULL1/a>) {v.2801/a>                1a href="+code=printk" class="sref">printk1/a>(1a href="+code=KERN_WARNING" class="sref">KERN_WARNING1/a> 1spa  class="string">"windfarm: System fan config not found ".2811/a>                       1spa  class="string">"for this.machine.model, max fan speed\n".2821/a>                goto 1a href="+code=fail" class="sref">fail1/a>;v.2831/a>        }v.2841/a>v.2851/a>        1spa  class="comment">/* Alloc & initialize state */1/spa  v.2861/a>        1a href="+code=wf_smu_sys_fans" class="sref">wf_smu_sys_fans1/a> = 1a href="+code=kmalloc" class="sref">kmalloc1/a>(sizeof(struct 1a href="+code=wf_smu_sys_fans_state" class="sref">wf_smu_sys_fans_state1/a>),v.2871/a>                                  1a href="+code=GFP_KERNEL" class="sref">GFP_KERNEL1/a>);v.2881/a>        if (1a href="+code=wf_smu_sys_fans" class="sref">wf_smu_sys_fans1/a> == 1a href="+code=NULL" class="sref">NULL1/a>) {v.2891/a>                1a href="+code=printk" class="sref">printk1/a>(1a href="+code=KERN_WARNING" class="sref">KERN_WARNING1/a> 1spa  class="string">"windfarm: Memory alloca >
  error".2901/a>                       1spa  class="string">" max fan speed\n".2911/a>                goto 1a href="+code=fail" class="sref">fail1/a>;v.2921/a>        }v.2931/a>        1a href="+code=wf_smu_sys_fans" class="sref">wf_smu_sys_fans1/a>->1a href="+code=ticks" class="sref">ticks1/a> = 1;v.2941/a>        1a href="+code=wf_smu_sys_fans" class="sref">wf_smu_sys_fans1/a>->1a href="+code=scale0" class="sref">scale01/a> = 1a href="+code=param" class="sref">param1/a>->1a href="+code=scale0" class="sref">scale01/a>;v.2951/a>        1a href="+code=wf_smu_sys_fans" class="sref">wf_smu_sys_fans1/a>->1a href="+code=pffset0" class="sref">pffset01/a> = 1a href="+code=param" class="sref">param1/a>->1a href="+code=pffset0" class="sref">pffset01/a>;v.2961/a>        1a href="+code=wf_smu_sys_fans" class="sref">wf_smu_sys_fans1/a>->1a href="+code=scale1" class="sref">scale11/a> = 1a href="+code=param" class="sref">param1/a>->1a href="+code=scale1" class="sref">scale11/a>;v.2971/a>        1a href="+code=wf_smu_sys_fans" class="sref">wf_smu_sys_fans1/a>->1a href="+code=pffset1" class="sref">pffset11/a> = 1a href="+code=param" class="sref">param1/a>->1a href="+code=pffset1" class="sref">pffset11/a>;v.2981/a>v.2991/a>        1spa  class="comment">/* Fill PID params */1/spa  v.304"
a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=gd" class="sref">gd1/a> = 1a href="+code=param" class="sref">param1/a>->1a href="+code=gd" class="sref">gd1/a>;v.3011/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=gp" class="sref">gp1/a> = 1a href="+code=param" class="sref">param1/a>->1a href="+code=gp" class="sref">gp1/a>;v.3021/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=gr" class="sref">gr1/a> = 1a href="+code=param" class="sref">param1/a>->1a href="+code=gr" class="sref">gr1/a>;v.3031/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=interon>" class="sref">interon>1/a> = 1a href="+code=WF_SMU_SYS_FANS_INTERVAL" class="sref">WF_SMU_SYS_FANS_INTERVAL1/a>;v.3041/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=his ory_len" class="sref">his ory_len1/a> = 1a href="+code=WF_SMU_SYS_FANS_HISTORY_SIZE" class="sref">WF_SMU_SYS_FANS_HISTORY_SIZE1/a>;v.3051/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=itarget" class="sref">itarget1/a> = 1a href="+code=param" class="sref">param1/a>->1a href="+code=itarget" class="sref">itarget1/a>;v.3061/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=min" class="sref">min1/a> = 1a href="+code=wf_control_get_min" class="sref">wf_control_get_min1/a>(1a href="+code=fan_system" class="sref">fan_system1/a>);v.3071/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=max" class="sref">max1/a> = 1a href="+code=wf_control_get_max" class="sref">wf_control_get_max1/a>(1a href="+code=fan_system" class="sref">fan_system1/a>);v.3081/a>        if (1a href="+code=fan_hd" class="sref">fan_hd1/a>) {v.3091/a>                1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=min" class="sref">min1/a> =v.3101/a>                        1a href="+code=max" class="sref">max1/a>(1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=min" class="sref">min1/a>, 1a href="+code=wf_control_get_min" class="sref">wf_control_get_min1/a>(1a href="+code=fan_hd" class="sref">fan_hd1/a>));v.3111/a>                1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=max" class="sref">max1/a> =v.3121/a>                        1a href="+code=min" class="sref">min1/a>(1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=max" class="sref">max1/a>, 1a href="+code=wf_control_get_max" class="sref">wf_control_get_max1/a>(1a href="+code=fan_hd" class="sref">fan_hd1/a>));v.3131/a>        }v.3141/a>        1a href="+code=wf_pid_init" class="sref">wf_pid_init1/a>(&1a href="+code=wf_smu_sys_fans" class="sref">wf_smu_sys_fans1/a>->1a href="+code=pid" class="sref">pid1/a>, &1a href="+code=pid_param" class="sref">pid_param1/a>);v.3151/a>v.3161/a>        1a href="+code=DBG" class="sref">DBG1/a>(1spa  class="string">"wf: System Fan control initialized.\n".3171/a>        1a href="+code=DBG" class="sref">DBG1/a>(1spa  class="string">"    itarged=%d.%03d, min=%d RPM, max=%d RPM\n".3181/a>            1a href="+code=FIX32TOPRINT" class="sref">FIX32TOPRINT1/a>(1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=itarget" class="sref">itarget1/a>), 1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=min" class="sref">min1/a>, 1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=max" class="sref">max1/a>);v.3191/a>        return;v.324"
a>v.3211/a> 1a href="+code=fail" class="sref">fail1/a>:v.3221/a>v.3231/a>        if (1a href="+code=fan_system" class="sref">fan_system1/a>)v.3241/a>                1a href="+code=wf_control_set_max" class="sref">wf_control_set_max1/a>(1a href="+code=fan_system" class="sref">fan_system1/a>);v.3251/a>        if (1a href="+code=fan_hd" class="sref">fan_hd1/a>)v.3261/a>                1a href="+code=wf_control_set_max" class="sref">wf_control_set_max1/a>(1a href="+code=fan_hd" class="sref">fan_hd1/a>);v.3271/a>}v.3281/a>v.3291/a>static void 1a href="+code=wf_smu_sys_fans_tick" class="sref">wf_smu_sys_fans_tick1/a>(struct 1a href="+code=wf_smu_sys_fans_state" class="sref">wf_smu_sys_fans_state1/a> *1a href="+code=st" class="sref">st1/a>)v.334"
a>{v.3311/a>        1a href="+code=s32" class="sref">s321/a> 1a href="+code=new_setpoint" class="sref">new_setpoint1/a>, 1a href="+code=temp" class="sref">temp1/a>, 1a href="+code=scaled" class="sref">scaled1/a>, 1a href="+code=cputarget" class="sref">cputarget1/a>;v.3321/a>        int 1a href="+code=rc" class="sref">rc1/a>;v.3331/a>v.3341/a>        if (--1a href="+code=st" class="sref">st1/a>->1a href="+code=ticks" class="sref">ticks1/a> != 0) {v.3351/a>                if (1a href="+code=wf_smu_readjust" class="sref">wf_smu_readjust1/a>)v.3361/a>                        goto 1a href="+code=readjust" class="sref">readjust1/a>;v.3371/a>                return;v.3381/a>        }v.3391/a>        1a href="+code=st" class="sref">st1/a>->1a href="+code=ticks" class="sref">ticks1/a> = 1a href="+code=WF_SMU_SYS_FANS_INTERVAL" class="sref">WF_SMU_SYS_FANS_INTERVAL1/a>;v.344"
a>v.3411/a>        1a href="+code=rc" class="sref">rc1/a> = 1a href="+code=wf_sensor_get" class="sref">wf_sensor_get1/a>(1a href="+code=sensor_hd_temp" class="sref">sensor_hd_temp1/a>, &1a href="+code=temp" class="sref">temp1/a>);v.3421/a>        if (1a href="+code=rc" class="sref">rc1/a>) {v.3431/a>                1a href="+code=printk" class="sref">printk1/a>(1a href="+code=KERN_WARNING" class="sref">KERN_WARNING1/a> 1spa  class="string">"windfarm: HD temp sensor error %d\n".3441/a>                       1a href="+code=rc" class="sref">rc1/a>);v.3451/a>                1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failure_state1/a> |= 1a href="+code=FAILURE_SENSOR" class="sref">FAILURE_SENSOR1/a>;v.3461/a>                return;v.3471/a>        }v.3481/a>v.3491/a>        1a href="+code=DBG" class="sref">DBG1/a>(1spa  class="string">"wf_smu: System Fans tick ! HD temp: %d.%03d\n".3501/a>            1a href="+code=FIX32TOPRINT" class="sref">FIX32TOPRINT1/a>(1a href="+code=temp" class="sref">temp1/a>));v.3511/a>v.3521/a>        if (1a href="+code=temp" class="sref">temp1/a> > (1a href="+code=st" class="sref">st1/a>->1a href="+code=pid" class="sref">pid1/a>.1a href="+code=param" class="sref">param1/a>.1a href="+code=itarget" class="sref">itarget1/a> + 0x50000))v.3531/a>                1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failure_state1/a> |= 1a href="+code=FAILURE_OVERTEMP" class="sref">FAILURE_OVERTEMP1/a>;v.3541/a>v.3551/a>        1a href="+code=new_setpoint" class="sref">new_setpoint1/a> = 1a href="+code=wf_pid_run" class="sref">wf_pid_run1/a>(&1a href="+code=st" class="sref">st1/a>->1a href="+code=pid" class="sref">pid1/a>, 1a href="+code=temp" class="sref">temp1/a>);v.3561/a>v.3571/a>        1a href="+code=DBG" class="sref">DBG1/a>(1spa  class="string">"wf_smu: new_setpoint: %d RPM\n"new_setpoint1/a>);v.3581/a>v.3591/a>        1a href="+code=scaled" class="sref">scaled1/a> = ((((1a href="+code=s64" class="sref">s641/a>)1a href="+code=new_setpoint" class="sref">new_setpoint1/a>) * (1a href="+code=s64" class="sref">s641/a>)1a href="+code=st" class="sref">st1/a>->1a href="+code=scale0" class="sref">scale01/a>) >> 12) + 1a href="+code=st" class="sref">st1/a>->1a href="+code=pffset0" class="sref">pffset01/a>;v.364"
a>v.3611/a>        1a href="+code=DBG" class="sref">DBG1/a>(1spa  class="string">"wf_smu: scaled setpoint: %d RPM\n"scaled1/a>);v.3621/a>v.3631/a>        1a href="+code=cputarget" class="sref">cputarget1/a> = 1a href="+code=wf_smu_cpu_fans" class="sref">wf_smu_cpu_fans1/a> ? 1a href="+code=wf_smu_cpu_fans" class="sref">wf_smu_cpu_fans1/a>->1a href="+code=pid" class="sref">pid1/a>.1a href="+code=target" class="sref">target1/a> : 0;v.3641/a>        1a href="+code=cputarget" class="sref">cputarget1/a> = ((((1a href="+code=s64" class="sref">s641/a>)1a href="+code=cputarget" class="sref">cputarget1/a>) * (1a href="+code=s64" class="sref">s641/a>)1a href="+code=st" class="sref">st1/a>->1a href="+code=scale1" class="sref">scale11/a>) >> 12) + 1a href="+code=st" class="sref">st1/a>->1a href="+code=pffset1" class="sref">pffset11/a>;v.3651/a>        1a href="+code=scaled" class="sref">scaled1/a> = 1a href="+code=max" class="sref">max1/a>(1a href="+code=scaled" class="sref">scaled1/a>, 1a href="+code=cputarget" class="sref">cputarget1/a>);v.3661/a>        1a href="+code=scaled" class="sref">scaled1/a> = 1a href="+code=max" class="sref">max1/a>(1a href="+code=scaled" class="sref">scaled1/a>, 1a href="+code=st" class="sref">st1/a>->1a href="+code=pid" class="sref">pid1/a>.1a href="+code=param" class="sref">param1/a>.1a href="+code=min" class="sref">min1/a>);v.3671/a>        1a href="+code=scaled" class="sref">scaled1/a> = 1a href="+code=min" class="sref">min1/a>(1a href="+code=scaled" class="sref">scaled1/a>, 1a href="+code=st" class="sref">st1/a>->1a href="+code=pid" class="sref">pid1/a>.1a href="+code=param" class="sref">param1/a>.1a href="+code=max" class="sref">max1/a>);v.3681/a>v.3691/a>        1a href="+code=DBG" class="sref">DBG1/a>(1spa  class="string">"wf_smu: adjusted setpoint: %d RPM\n"scaled1/a>);v.374"
a>v.3711/a>        if (1a href="+code=st" class="sref">st1/a>->1a href="+code=sys_setpoint" class="sref">sys_setpoint1/a> == 1a href="+code=scaled" class="sref">scaled1/a> && 1a href="+code=new_setpoint" class="sref">new_setpoint1/a> == 1a href="+code=st" class="sref">st1/a>->1a href="+code=hd_setpoint" class="sref">hd_setpoint1/a>)v.3721/a>                return;v.3731/a>        1a href="+code=st" class="sref">st1/a>->1a href="+code=sys_setpoint" class="sref">sys_setpoint1/a> = 1a href="+code=scaled" class="sref">scaled1/a>;v.3741/a>        1a href="+code=st" class="sref">st1/a>->1a href="+code=hd_setpoint" class="sref">hd_setpoint1/a> = 1a href="+code=new_setpoint" class="sref">new_setpoint1/a>;v.3751/a> 1a href="+code=readjust" class="sref">readjust1/a>:v.3761/a>        if (1a href="+code=fan_system" class="sref">fan_system1/a> && 1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failure_state1/a> == 0) {v.3771/a>                1a href="+code=rc" class="sref">rc1/a> = 1a href="+code=wf_control_set" class="sref">wf_control_set1/a>(1a href="+code=fan_system" class="sref">fan_system1/a>, 1a href="+code=st" class="sref">st1/a>->1a href="+code=sys_setpoint" class="sref">sys_setpoint1/a>);v.3781/a>                if (1a href="+code=rc" class="sref">rc1/a>) {v.3791/a>                        1a href="+code=printk" class="sref">printk1/a>(1a href="+code=KERN_WARNING" class="sref">KERN_WARNING1/a> 1spa  class="string">"windfarm: Sys fan error %d\n".3801/a>                               1a href="+code=rc" class="sref">rc1/a>);v.3811/a>                        1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failure_state1/a> |= 1a href="+code=FAILURE_FAN" class="sref">FAILURE_FAN1/a>;v.3821/a>                }v.3831/a>        }v.3841/a>        if (1a href="+code=fan_hd" class="sref">fan_hd1/a> && 1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failure_state1/a> == 0) {v.3851/a>                1a href="+code=rc" class="sref">rc1/a> = 1a href="+code=wf_control_set" class="sref">wf_control_set1/a>(1a href="+code=fan_hd" class="sref">fan_hd1/a>, 1a href="+code=st" class="sref">st1/a>->1a href="+code=hd_setpoint" class="sref">hd_setpoint1/a>);v.3861/a>                if (1a href="+code=rc" class="sref">rc1/a>) {v.3871/a>                        1a href="+code=printk" class="sref">printk1/a>(1a href="+code=KERN_WARNING" class="sref">KERN_WARNING1/a> 1spa  class="string">"windfarm: HD fan error %d\n".3881/a>                               1a href="+code=rc" class="sref">rc1/a>);v.3891/a>                        1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failure_state1/a> |= 1a href="+code=FAILURE_FAN" class="sref">FAILURE_FAN1/a>;v.3901/a>                }v.3911/a>        }v.3921/a>}v.3931/a>v.3941/a>static void 1a href="+code=wf_smu_create_cpu_fans" class="sref">wf_smu_create_cpu_fans1/a>(void)v.3951/a>{v.3961/a>        struct 1a href="+code=wf_cpu_pid_param" class="sref">wf_cpu_pid_param1/a> 1a href="+code=pid_param" class="sref">pid_param1/a>;v.3971/a>        const struct 1a href="+code=smu_sdbp_header" class="sref">smu_sdbp_header1/a> *1a href="+code=hdr" class="sref">hdr1/a>;v.3981/a>        struct 1a href="+code=smu_sdbp_cpupiddata" class="sref">smu_sdbp_cpupiddata1/a> *1a href="+code=piddata" class="sref">piddata1/a>;v.3991/a>        struct 1a href="+code=smu_sdbp_fvt" class="sref">smu_sdbp_fvt1/a> *1a href="+code=fvt" class="sref">fvt1/a>;v.404"
a>        1a href="+code=s32" class="sref">s321/a> 1a href="+code=tmax" class="sref">tmax1/a>, 1a href="+code=tdelta" class="sref">tdelta1/a>, 1a href="+code=maxpow" class="sref">maxpow1/a>, 1a href="+code=powadj" class="sref">powadj1/a>;v.4011/a>v.4021/a>        1spa  class="comment">/* First, loca e the PID params in SMU SBD */1/spa  v.4031/a>        1a href="+code=hdr" class="sref">hdr1/a> = 1a href="+code=smu_get_sdb_parti >
 " class="sref">smu_get_sdb_parti >
 1/a>(1a href="+code=SMU_SDB_CPUPIDDATA_ID" class="sref">SMU_SDB_CPUPIDDATA_ID1/a>, 1a href="+code=NULL" class="sref">NULL1/a>);v.4041/a>        if (1a href="+code=hdr" class="sref">hdr1/a> == 0) {v.4051/a>                1a href="+code=printk" class="sref">printk1/a>(1a href="+code=KERN_WARNING" class="sref">KERN_WARNING1/a> 1spa  class="string">"windfarm: CPU PID fan config not found ".4061/a>                       1spa  class="string">"max fan speed\n".4071/a>                goto 1a href="+code=fail" class="sref">fail1/a>;v.4081/a>        }v.4091/a>        1a href="+code=piddata" class="sref">piddata1/a> = (struct 1a href="+code=smu_sdbp_cpupiddata" class="sref">smu_sdbp_cpupiddata1/a> *)&1a href="+code=hdr" class="sref">hdr1/a>[1];v.414"
a>v.4111/a>        1spa  class="comment">/* Get the FVT params for operating point 0 (the only supported one.4121/a>1spa  class="comment">         * for now) in order to get tmax1/spa  v.4131/a>1spa  class="comment">         */1/spa  v.4141/a>        1a href="+code=hdr" class="sref">hdr1/a> = 1a href="+code=smu_get_sdb_parti >
 " class="sref">smu_get_sdb_parti >
 1/a>(1a href="+code=SMU_SDB_FVT_ID" class="sref">SMU_SDB_FVT_ID1/a>, 1a href="+code=NULL" class="sref">NULL1/a>);v.4151/a>        if (1a href="+code=hdr" class="sref">hdr1/a>) {v.4161/a>                1a href="+code=fvt" class="sref">fvt1/a> = (struct 1a href="+code=smu_sdbp_fvt" class="sref">smu_sdbp_fvt1/a> *)&1a href="+code=hdr" class="sref">hdr1/a>[1];v.4171/a>                1a href="+code=tmax" class="sref">tmax1/a> = ((1a href="+code=s32" class="sref">s321/a>)1a href="+code=fvt" class="sref">fvt1/a>->1a href="+code=maxtemp" class="sref">maxtemp1/a>) <<.16;v.4181/a>        } elsev.4191/a>                1a href="+code=tmax" class="sref">tmax1/a> = 0x5e0000; 1spa  class="comment">/* 94 degree default */1/spa  v.424"
a>v.4211/a>        1spa  class="comment">/* Alloc & initialize state */1/spa  v.4221/a>        1a href="+code=wf_smu_cpu_fans" class="sref">wf_smu_cpu_fans1/a> = 1a href="+code=kmalloc" class="sref">kmalloc1/a>(sizeof(struct 1a href="+code=wf_smu_cpu_fans_state" class="sref">wf_smu_cpu_fans_state1/a>),v.4231/a>                                  1a href="+code=GFP_KERNEL" class="sref">GFP_KERNEL1/a>);v.4241/a>        if (1a href="+code=wf_smu_cpu_fans" class="sref">wf_smu_cpu_fans1/a> == 1a href="+code=NULL" class="sref">NULL1/a>)v.4251/a>                goto 1a href="+code=fail" class="sref">fail1/a>;v.4261/a>        1a href="+code=wf_smu_cpu_fans" class="sref">wf_smu_cpu_fans1/a>->1a href="+code=ticks" class="sref">ticks1/a> = 1;v.4271/a>v.4281/a>        1a href="+code=wf_smu_cpu_fans" class="sref">wf_smu_cpu_fans1/a>->1a href="+code=scale" class="sref">scale1/a> = 1a href="+code=WF_SMU_CPU_FANS_SIBLING_SCALE" class="sref">WF_SMU_CPU_FANS_SIBLING_SCALE1/a>;v.4291/a>        1a href="+code=wf_smu_cpu_fans" class="sref">wf_smu_cpu_fans1/a>->1a href="+code=pffset" class="sref">pffset1/a> = 1a href="+code=WF_SMU_CPU_FANS_SIBLING_OFFSET" class="sref">WF_SMU_CPU_FANS_SIBLING_OFFSET1/a>;v.434"
a>v.4311/a>        1spa  class="comment">/* Fill PID params */1/spa  v.4321/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=interon>" class="sref">interon>1/a> = 1a href="+code=WF_SMU_CPU_FANS_INTERVAL" class="sref">WF_SMU_CPU_FANS_INTERVAL1/a>;v.4331/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=his ory_len" class="sref">his ory_len1/a> = 1a href="+code=piddata" class="sref">piddata1/a>->1a href="+code=his ory_len" class="sref">his ory_len1/a>;v.4341/a>        if (1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=his ory_len" class="sref">his ory_len1/a> > 1a href="+code=WF_CPU_PID_MAX_HISTORY" class="sref">WF_CPU_PID_MAX_HISTORY1/a>) {v.4351/a>                1a href="+code=printk" class="sref">printk1/a>(1a href="+code=KERN_WARNING" class="sref">KERN_WARNING1/a> 1spa  class="string">"windfarm: His ory size overflow on ".4361/a>                       1spa  class="string">"CPU control loop (%d)\n"piddata1/a>->1a href="+code=his ory_len" class="sref">his ory_len1/a>);v.4371/a>                1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=his ory_len" class="sref">his ory_len1/a> = 1a href="+code=WF_CPU_PID_MAX_HISTORY" class="sref">WF_CPU_PID_MAX_HISTORY1/a>;v.4381/a>        }v.4391/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=gd" class="sref">gd1/a> = 1a href="+code=piddata" class="sref">piddata1/a>->1a href="+code=gd" class="sref">gd1/a>;v.444"
a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=gp" class="sref">gp1/a> = 1a href="+code=piddata" class="sref">piddata1/a>->1a href="+code=gp" class="sref">gp1/a>;v.4411/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=gr" class="sref">gr1/a> = 1a href="+code=piddata" class="sref">piddata1/a>->1a href="+code=gr" class="sref">gr1/a> / 1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=his ory_len" class="sref">his ory_len1/a>;v.4421/a>v.4431/a>        1a href="+code=tdelta" class="sref">tdelta1/a> = ((1a href="+code=s32" class="sref">s321/a>)1a href="+code=piddata" class="sref">piddata1/a>->1a href="+code=target_temp_delta" class="sref">target_temp_delta1/a>) <<.16;v.4441/a>        1a href="+code=maxpow" class="sref">maxpow1/a> = ((1a href="+code=s32" class="sref">s321/a>)1a href="+code=piddata" class="sref">piddata1/a>->1a href="+code=max_power" class="sref">max_power1/a>) <<.16;v.4451/a>        1a href="+code=powadj" class="sref">powadj1/a> = ((1a href="+code=s32" class="sref">s321/a>)1a href="+code=piddata" class="sref">piddata1/a>->1a href="+code=power_adj" class="sref">power_adj1/a>) <<.16;v.4461/a>v.4471/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=tmax" class="sref">tmax1/a> = 1a href="+code=tmax" class="sref">tmax1/a>;v.4481/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=ttarget" class="sref">ttarget1/a> = 1a href="+code=tmax" class="sref">tmax1/a> - 1a href="+code=tdelta" class="sref">tdelta1/a>;v.4491/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=pmaxadj" class="sref">pmaxadj1/a> = 1a href="+code=maxpow" class="sref">maxpow1/a> - 1a href="+code=powadj" class="sref">powadj1/a>;v.454"
a>v.4511/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=min" class="sref">min1/a> = 1a href="+code=wf_control_get_min" class="sref">wf_control_get_min1/a>(1a href="+code=fan_cpu_main" class="sref">fan_cpu_main1/a>);v.4521/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=max" class="sref">max1/a> = 1a href="+code=wf_control_get_max" class="sref">wf_control_get_max1/a>(1a href="+code=fan_cpu_main" class="sref">fan_cpu_main1/a>);v.4531/a>v.4541/a>        1a href="+code=wf_cpu_pid_init" class="sref">wf_cpu_pid_init1/a>(&1a href="+code=wf_smu_cpu_fans" class="sref">wf_smu_cpu_fans1/a>->1a href="+code=pid" class="sref">pid1/a>, &1a href="+code=pid_param" class="sref">pid_param1/a>);v.4551/a>v.4561/a>        1a href="+code=DBG" class="sref">DBG1/a>(1spa  class="string">"wf: CPU Fan control initialized.\n".4571/a>        1a href="+code=DBG" class="sref">DBG1/a>(1spa  class="string">"    ttarged=%d.%03d, tmax=%d.%03d, min=%d RPM, max=%d RPM\n".3181/a>            1a href="+code=FIX32TOPRINT" class="sref">FIX32TOPRINT1/a>(1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=ttarget" class="sref">itarget1/a>), 1a href="+code=FIX32TOPRINT" class="sref">FIX32TOPRINT1/a>(1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=tmax" class="sans_state1/a>),v.4191/a11/a>        1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=min" class="sref">min1/a>, 1a href="+code=pid_param" class="sref">pid_param1/a>.1a href="+code=max" class="sref">max1/a>);v.364"
a>v.36             return;v.3621/a>v.3641/a>        1a href="+code=printk" class="sref">printk1/a>(1a href="+code=KERN_WARNING" class="sref">KERN_WARNING1/a> 1spa  class="string">&qug">&arm: CPU PID fan conax=%d RPM\nreadjust1/a>:v.4351/a>  _WARNING1/a> 1spa  class="s">  thisn=&ch365 m>(1lin=&#ng">"max fan speed\n".4461/a>v.3641/a>        if (1asrefreq_7" ="+code=maxtemp" srefreq_7" ="ss="s446">.4461/a>v.3881/a>   f">max1/a> = 1a href="+code=wf_control_set_max" class="sref">wf_control_set_max1/a>(1asrefreq_7" ="+code=maxtemp" srefreq_7" ="ss="squot;.3641/a>        if (1a href="+code=fan_cpu_main" class="sref">fan_uot;.3901/a>   f">max1/a> = 1a href="+code=wf_control_set_max" class="sref">wf_control_set_max1/a>(1a href="+code=fan_cpu_main" class="sref">fan_cpu_main1/a>);v        }v.3621/a>v.3941/a>static void 1a href="+ref">wf_smu_sys_fans_tick" class="+ref">wf_smu_ntrolc1/a>(sizeof(struct 1a href="+code=wf_smu_cpu_fans_state" class="sref">wf_smu_cpu_fans_state1/a> *1a href="+code=st" class="sref">st1/a>)v) {v.3651/a>        1a href="+code=s32" class="sref">s321/a> 1a href="+code=new_setpoint" class="sref">new_setpoint1/a>, 1a href="+code=temp" class="sref">temp1/a>, 1af="+code=max_power" s="sref">f">fan_hd1/a>, 1a yshref="+code=ttarget"  yshref=""sref">powadj1/a>;v.3761/a>        int 1a href="+code=rc" class="sref">rc1/a>;v.4271/a>v.3741/a>        if (--1a href="+code=st" class="sref">st1/a>->1a href="+code=ticks" class="sref">ticks1/a> != 0) {v.3791/a>                if (1a href="+code=wf_smu_readjust" class="sref">wf_smu_readjust1/a>)v.3801/a>                        goto 1a href="+code=readjust" class="sref">readjust1/a>;v.3811/a>                return;v.3881/a>        }v.3731/a>        1a href="+code=st" class="sref">st1/a>->1a href="+code=ticks" class="sref">ticks1/a> = 1a href="+code=WF_SMU_CPU_FANS_INTERVAL" class="sref">WF_SMU_CPU_FANS_INTERVAL1/a>;v.3541/a>v.3651/a>        1a href="+code=rc" class="sref">rc1/a> = 1a href="+code=wf_sensor_get" class="sref">wf_sensor_get1/a>(1a href="srefde=sensor_hd_temp" class="srefde=sss="sref">pid1/a>, &1a href="+code=temp" class="sref">temp1/a>);v.3761/a>        if (1a href="+code=rc" class="sref">rc1/a>) {v.3871/a>   41/a>        1a href="+code=printk" class="sref">printk1/a>(1a href="+code=KERN_WARNING" class="sref">KERN_WARNING1/a> 1spa  class="string">&qug">&windfarm: HD temp sensor error %d\n".3881/a>          >        if (1a href="+code=rc" class="ef">temp1/a>);v.3891/a>            if (1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failure_state1/a> |= 1a href="+code=FAILURE_SENSOR" class="sref">FAILURE_SENSOR1/a>;v.3901/a>                return;v.3911/a>        }v.3621/a>v.3731/a>        1a href="+code=rc" class="sref">rc1/a> = 1a href="+code=wf_sensor_get" class="sref">wf_sensor_get1/a>(1a href="sreff="+code=max_power"  href="sreff="+css="sref">pid1/a>, &1a ="+code=max_power" s="sref">"ef">temp1/a>);v.4341/a>        if (1a href="+code=rc" class="sref">rc1/a>) {v.4351/a>                1a href="+code=printk" class="sref">printk1/a>(1a href="+code=KERN_WARNING" class="sref">KERN_WARNING1/a> 1spa  class="string">&qug">&s="srfarm: HD temp sensor error %d\n".4361/a>                   if (1a href="+code=rc" class="ef">temp1/a>);v.3871/a>   41/a>        1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failure_state1/a> |= 1a href="+code=FAILURE_SENSOR" class="sref">FAILURE_SENSOR1/a>;v.3881/a>                return;v.3911/a>        }v.364"
a>v.3611/a>        1a href="+code=DBG" class="sref">DBG1/a>(1spa  class="string">&g">&quou: Systemg">&windick ! HD temp: &#,&s="srick ! HD temp: %d.%03d\n".40>.3611/a>        1a href="+code=FIX32TOPRINT" class="sref">FIX32TOPRINT1/a>(1a href="+code=temp" class="sr>itarget1/a>), 1a href="+code=FIX32TOPRINT" class="sref">FIX32TOPRINT1/a>(1a ="+code=max_power" s="sref">""ef">temp1/a>);v.4531/a>v), 1aHACKED+code=FAILURE_OVERTEMP" HACKED+code=FAI  
L453">.4531/a>v.4151/a>        if (1a href="+code=temp" class="sref">t0x4aget1/453">.4531/a>v.4061/a>   41/a>        1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failure_state1/a> |= 1a href="+code=FAILURE_OVERTEMP" class="sref">FAILURE_OVERTEMP1/a>;v        } elsev.3741/a>        if (1a href="+code=temp" class="sref">t31/a>        1a href="+code=st" class="sref">st1/a>->1a href="+code=pid" class="sref">pid1/a>.1a href="+code=param" class="sref">param1/a>.1a href="+code=tmax" class="sa       } elsev.3891/a>            if (1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failure_state1/a> |= 1a href="+code=FAILURE_OVERTEMP" class="sref">FAILURE_OVERTEMP1/a>;v;v.3611/a>        1a href="+code=new_setpoint" class="sref">new_s541/a>        1a href="+codruontrol_get_min" clasf="+codruo>FIX3ef">pid1/a>, &1a href="+code=st" class="sref">st1/a>->1a href="+code=pid" class="ref">temp1/a>, 1af="+code=max_power" s="sref">f">fan_hd1/a>, 1a href="+code=temp" class="sref">temp1/a>);v.3621/a>v.3731/a>        1a href="+code=DBG" class="sref">DBG1/a>(1spa  class="string">&class="sref"sted setpoint: %d RPM\n"newref">temp1/a>);v.3541/a>v.3651/a>        1a yshref="+code=ttarget"  yshref=""srecputarget1/a> = 1a href="clase=wf_smu_cpu_fans" class="clase=wf"sreccpu_fans1/a> ? 1a href="clase=wf_smu_cpu_fans" class="clase=wf"sre_cpu_fans1/a>->1a href="+code=pid" class="sref">pid1/a>.1a href="+code=target" class="sref">target1/a> : 0;v.3661/a>        1a yshref="+code=ttarget"  yshref=""srecputarget1/a> = ((((1a href="+code=s64" class="sref">s641/a>)1a yshref="+code=ttarget"  yshref=""srecputarget1/a>) * (1a href="+code=s64" class="sref">s641/a>)1a href="+code=st" class="sref">st1/a>->1a hrefref="+code=st" class="srf">scale11/a>)rget1/a> : 0;v.4171/a>   >> 12) + 1a href="+code=st" class="sref">st1/a>->1a href=ref="+code=st" class="srearget1/a> : 0;v.4481/a>        1a href="+code=new_setpoint" class="sref">new_s541/a>        1a href="+code=max" class="sref">max1/a>(1a href="+code=new_setpoint" class="sref">new_setpoint1/a>, 1a yshref="+code=ttarget"  yshref=""srecarget1/a> : 0;v.4491/a>        1a href="+code=new_setpoint" class="sref">new_s541/a>        1a href="+code=max" class="sref">max1/a>(1a href="+code=new_setpoint" class="sref">new_setpoint1/a>, 1a href="+code=st" class="sref">st1/a>->1a href="+code=pid" class="sref">pid1/a>.1a href="+code=param" class="sref">param1/a>.1a href="+code=min" class="sref">min1/a>);v.444"
a>        1a href="+code=new_setpoint" class="sref">new_s541/a>        1a href="+code=min" class="sref">min1/a>(1a href="+code=new_setpoint" class="sref">new_setpoint1/a>, 1a href="+code=st" class="sref">st1/a>->1a href="+code=pid" class="sref">pid1/a>.1a href="+code=param" class="sref">param1/a>.1a href="+code=max" class="sref">max1/a>);v.4011/a>v.4221/a>        1a href="+code=DBG" class="sref">DBG1/a>(1spa  class="string">"wf_smu: adjusted setpoint: %d RPM\n"newref">temp1/a>);v.4531/a>v.4241/a>        if (1a href="+code=st" class="sref">st1/a>->1asf="f="+code=new_setpoint" sf="f="+code>new_ssetpoint1/a> = 1a href="+code=new_setpoint" class="sref">new)rget1/a> : 0;v.4251/a>                return;v.4261/a>        1a href="+code=st" class="sref">st1/a>->1asf="f="+code=new_setpoint" sf="f="+code>new_setpoint1/a> = 1a href="+code=new_setpoint" class="sref">new       return;vreadjust1/a>:v.3741/a>        if (1a href="+code=fan_cpu_main" class="sref">fanf">fan_hd1/a> && 1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failure_state1/a> == 0) {v.3891/a>            if (1a href="+code=rc" class="sref">rc1/a> = 1a href="+code=wf_control_set" class="sref">wf_control_set1/a>(1a href="+code=fan_cpu_main" class="sref">fan_setpoint1/a>, 1a href="+code=st" class="sref">st1/a>->1asf="f="+code=new_setpoint" sf="f="+code>newref">temp1/a>);v.3901/a>   41/a>        if (1a href="+code=rc" class="sref">rc1/a>) {v.3811/a>                        1a href="+code=printk" class="sref">printk1/a>(1a href="+code=KERN_WARNING" class="sref">KERN_WARNING1/a> 1spa  class="string">&qug">&ref"ng">=%d RPM\nreadjust1/a>:v.40>.36.3811/a>            ef">DBG1/a>(1spa  class="st temp sensor error %d\n&          if (1a href="+code=rc" class="ef">temp1/a>);v.4231/a>                    if (1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failure_state1/a> |= 1a href="+code=FAILURE_FAN" class="sref">FAILURE_FAN1/a>;v.433333333311/a>        }v.4311/a>        }v        }v.4271/a>v        1spa  classd RPM\nreadjust1/a>:v.4131/a>1spa  clas* ****** S   p / Init / Misc ... ******d RPM\nreadjust1/a>:v.4131/a>1spa  clas*d RPM\nreadjust1/a>:v.4131/a>1spa  clas* PID params */1/spa  v.4421/a>v.3941/a>static void 1a href="smu_sys_fans_tick" class="smu_ntrolcpu_fans1/a>(void)v) {v.44unsignf_s61/a>        int 1a" it"sref">wsys_fans_tick" " it"sref">w"srecputarget1/a> = 1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failILURE_FAN1/a>;v.44unsignf_s61/a>        int 1aclassref">wsys_fans_tick" classref">wfailILURE_FAN1/a>;v.4271/a>v.3741/a!u_fans1/a> ? 1a href="ctahe o_smu_cpu_fans" class="ctahe oass="sref">rc1/a>) {v.3891/a>            if (1a href="+code=DBG" class="sref">DBG1/a>(1spa  class="strincref"ms fg">"CPUs !max fan speed\n".3901/a>   f">max1/a> = 1a hrss="sref">wclase=wf_smu_cpu_fans" class="sref">wclase=wfss="s".3811/a>   f">max1/a> = 1a hrss="sref">wf_smu_create_cpu_fans" class="sref">wf_smu_create_".40>.36.381u_fans1/a> ? 1a href="ctahe o_smu_cpu_fans" class="ctahe oass=ef">ticks1/a> = 1;v.4311/a>        }v.3541/a>v.3651/a>        1spa  class=Skippms fclasss* PID params */1/spa  v.3761/a>        if (1aclass="ckippms _smu_cpu_fans" class="ckippms >fanf">fan_hd1/a>        if (--1aclass="ckippms _smu_cpu_fans" class="ckippms >fanfans1/a>(void)v.4171/a>                return;v.4291/a>        1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failur>target1/a> : 0;v.3761/a>        if (1aclass="clase=wf_smu_cpu_fans" class="clase=wf"srefans1/a>(void)v.3811/a>   f">max1/a> = 1a hrss="clase=wf"smu_sys_fans_tick" class="clase=wf"smu_"sref">printk1/a>(1aclass="clase=wf_smu_cpu_fans" class="clase=wf"srefarget1/a> : 0;v.3761/a>        if (1aclass="+code=wf_smu_cpu_fans" class="sref">wf_smufans1/a>(void)v.4231/a>   >        if (1aclass="+code=wf_smu_sys_fans_tick" class="+ref">wf_smu_ntrol>        if (1aclass="+code=wf_smu_cpu_fans" class="sref">wf_smufarget1/a> : 0;v.3541/a>v.3651/a>        1a href="+code=wf_smu_readjust" class="sref">wf_smuur>target1/a> : 0;v.4261/a>        1aclassref">wsys_fans_tick" classref">wfailcputarget1/a> = 1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failent">/*~>        int 1a" it"sref">wsys_fans_tick" " it"sref">w"srearget1/a> : 0;v.4271/a>v.3851/a>        1spa  class=If elassms fsref">w m>(1,    mp srefreq and r mp allPID params */1/spa  v.4131/a>1spa  classsssssss*ng">snow)full".PID params */1/spa  v.4131/a>1spa  classsssssss* PID params */1/spa  v.3761/a>        if (1aclass="+code=wf_smu_failure_state" class="sref">wf_smu_failent">/nt">/*!u_fans1/a> ? 1a" it"sref">wsys_fans_tick" " it"sref">w"sre"sref">rc1/a>) {v.40>.36.38141/a>        if (1asrefreq_7" ="+code=maxtemp" srefreq_7" ="ss="s446">.4461/a>v.4231/a>                    if (1a href="+code=wf_control_set_max" class="sref">wf_control_set_max1/a>(1asrefreq_7" ="+code=maxtemp" srefreq_7" ="ss="squot;.433333333341/a>        if (1a hre yshef="+code=param"  hre yshefss="s446">.4461/a>v.4251/a>                    if (1a href="+code=wf_control_set_max" class="sref">wf_control_set_max1/a>(1a hre yshef="+code=param"  hre yshefss="squot;.4061/a>   41/a>        if (1a href="+code=fan_cpu_main" class="sref">fan_uot;.4171/a>                    if (1a href="+code=wf_control_set_max" class="sref">wf_control_set_max1/a>(1a href="+code=fan_cpu_main" class="sref">fan_cpu_main1/a>);v.3881/a>   41/a>        if (1a hreho_smu_cpu_fans"  hreho>fan_uot;.3791/a>                    if (1a href="+code=wf_control_set_max" class="sref">wf_control_set_max1/a>(1a hreho_smu_cpu_fans"  hreho>fan_cpu_main1/a>);v.3811/a>        }v.4011/a>v.3851/a>        1spa  class=If leavms fsref">w m>(1, un   mp srefreq and rref">wf_sD params */1/spa  v.4131/a>1spa  classsssssss*nallng">snon next iassation_sD params */1/spa  v.4131/a>1spa  classsssssss* PID params */1/spa  v.4151/a!u_fans1/a> ? 1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failent">/nt">/*u_fans1/a> ? 1a" it"sref">wsys_fans_tick" " it"sref">w"sre"sref">rc1/a>) {v.4061/a>   41/a>        if (1asrefreq_7" ="+code=maxtemp" srefreq_7" ="ss="s446">.4461/a>v.3871/a>                    if (1a href="+code=wf_control_get_min" class="srefs>wf_control_get_min1/a>(1asrefreq_7" ="+code=maxtemp" srefreq_7" ="ss="squot;.3881/a>   51/a>        1a href="+code=wf_smu_readjust" class="sref">wf_smuur>>ticks1/a> = 1;v.3911/a>        }v.364"
a>v.4311/a>        1spa  class=Ov.4131/a>1spa  classsssssss*nclasssto let the&windssat">w go down_sD params */1/spa  v.4131/a>1spa  classsssssss* PID params */1/spa  v.4341/a>        if (1aclassref">wsys_fans_tick" classref">wfailcnt">/*u_fans1/a> ? 1a href="+code=FAILURE_OVERTEMP" class="sref">FAILURE"sref">rc1/a>) {v.4351/a>                1aclasst_ov.4361/a>   >        if (1aclass="ckippms _smu_cpu_fans" class="ckippms >fanf= 2quot;.3871/a>   41/a>        1a href="ov : 0;v.3811/a>        }v        }v.4311/a>        1spa  class=Wenonly   ear the&ov.4131/a>1spa  classsssssss*n_and_ID  otherfsref">w is pres  c. Since afarm: HD temp willPID params */1/spa  v.4131/a>1spa  classsssssss*n  ear the&ovw windssat">w) af_sD params */1/spa  v.4131/a>1spa  classsssssss*nthe&g">"CPU levels, but we don't wantsto keedfitn  ear_sD params */1/spa  v.4131/a>1spa  classsssssss* herw in thisncass="D params */1/spa  v.4131/a>1spa  classsssssss* PID params */1/spa  v.3761/a!u_fans1/a> ? 1a href="+code=wf_smu_failure_state" class="sref">wf_smu_failent">/nt">/*u_fans1/a> ? 1a href="ovrc1/a>) {v.3871/a>   41/a>        1a hr  ear"ov.3881/a>   51/a>        1a href="ov : 0;v.3911/a>        }v        }v.4011/a>v.3941/a>static void 1a href="clasg">&quo_smu_readjust" clasf="clasg">&quoeate_c1/a>(sizeof(struct 1a hrg">&quo_smu_readjust" clag">&quoeateans_state1/a> *1ace=new_setpoint" s">new)rget1/a> : 0;vrc1/a>) {v.4341/a>        if (1aclasf="allag">&quos_o_sys_fans_tick" class="allag">&quos_o_>new)rget1/a> : 0;v.4251/a>                return;v.4461/a>v.3641/a>        if (1a href="+code=fan_cpu_main" class="sref">fanfssetpoint1/a> = 1aNUL_FANS_INTERVAL" NUL_failent">/nt">/*!u_fans1/a> ? 1ac1/c=sensor_hd_temp" c1/c=sntrol_get_min1/a>(1ase=new_setpoint" s">new"sref">st1/a>->1aclassys_fans_tick" clas>new,  ef">DBG1/a>(1spa  class="ss="-g">=%d RPM\n)"sref">rc1/a>) {v.3881/a>   41/a>        if (1acla">wfg">&quo_smu_readjust" cla">wfg">&quontrol_get_min1/a>(1ase=new_setpoint" s">new)ure_stef">rc1/a>) {v.3791/a>                    if (1a href="+code=fan_cpu_main" class="sref">fanfs          if (1ase=new_setpoint" s">new       return;v.3811/a>        }v.4011/a>v.3761/a>        if (1a hre yshef="+code=param"  hre yshefss="fssetpoint1/a> = 1aNUL_FANS_INTERVAL" NUL_failent">/nt">/*!u_fans1/a> ? 1ac1/c=sensor_hd_temp" c1/c=sntrol_get_min1/a>(1ase=new_setpoint" s">new"sref">st1/a>->1aclassys_fans_tick" clas>new,  ef">DBG1/a>(1spa  class="s yshef-g">=%d RPM\n)"sref">rc1/a>) {v.4231/a>   41/a>        if (1acla">wfg">&quo_smu_readjust" cla">wfg">&quontrol_get_min1/a>(1ase=new_setpoint" s">new)ure_stef">rc1/a>) {v.4333333333                 if (1a hre yshef="+code=param"  hre yshefss="fs          if (1ase=new_setpoint" s">new       return;v.4311/a>        }v.4461/a>v.3641/a>        if (1asrefreq_7" ="+code=maxtemp" srefreq_7" ="ss="fssetpoint1/a> = 1aNUL_FANS_INTERVAL" NUL_failent">/nt">/*!u_fans1/a> ? 1ac1/c=sensor_hd_temp" c1/c=sntrol_get_min1/a>(1ase=new_setpoint" s">new"sref">st1/a>->1aclassys_fans_tick" clas>new,  ef">DBG1/a>(1spa  class="ssrefreq-7" ="=%d RPM\n)"sref">rc1/a>) {v.3881/a>   41/a>        if (1acla">wfg">&quo_smu_readjust" cla">wfg">&quontrol_get_min1/a>(1ase=new_setpoint" s">new)ure_stef">rc1/a>) {v.3891/a>                    if (1asrefreq_7" ="+code=maxtemp" srefreq_7" ="ss="fs          if (1ase=new_setpoint" s">new       return;v.3811/a>        }v.4011/a>v.3851/a>        1spa  class=Darrs/ property list saysnthe&HDng">&isnonly ">  m>(1l IDPID params */1/spa  v.4131/a>1spa  classsssssss*n0, 1, 2 and 3PID params */1/spa  v.4131/a>1spa  classsssssss* PID params */1/spa  v.3761/a>        if (1aclass="refh_m>(1lsys_fans_tick" class="refh_m>(1lfailene11/3"sref">rc1/a>) {v.3871/a>   61/a>        if (1a hre yshef="+code=param"  hre yshefss="fnt">/nt">/*u_fans1/a> ? 1a href="+code=fan_cpu_main" class="sref">fanf">fan_hd1/a> && 1asrefreq_7" ="+code=maxtemp" srefreq_7" ="ss="s446">.4461/a>v.3881/a>          a>static void 1a href="allag">&quos_o_sys_fans_tick" class="allag">&quos_o_>newur>>ticks1/a> = 1;v.3891/a>                return;v.3811/a>        }v.4011/a>v.3761/a>        if (1a hreho_smu_cpu_fans"  hreho>fanfssetpoint1/a> = 1aNUL_FANS_INTERVAL" NUL_failent">/nt">/*!u_fans1/a> ? 1ac1/c=sensor_hd_temp" c1/c=sntrol_get_min1/a>(1ase=new_setpoint" s">new"sref">st1/a>->1aclassys_fans_tick" clas>new,  ef">DBG1/a>(1spa  class="s/a>v<-bay-g">=%d RPM\n)"sref">rc1/a>) {v.4231/a>   41/a>        if (1acla">wfg">&quo_smu_readjust" cla">wfg">&quontrol_get_min1/a>(1ase=new_setpoint" s">new)ure_stef">rc1/a>) {v.4333333333                 if (1a hreho_smu_cpu_fans"  hreho>fanfs          if (1ase=new_setpoint" s">new       return;v.4311/a>        }v.4461/a>v.3641/a>        if (1a hre yshef="+code=param"  hre yshefss="fnt">/nt">/*u_fans1/a> ? 1a hreho_smu_cpu_fans"  hreho>fanfnt">/nt">/*u_fans1/a> ? 1a href="+code=fan_cpu_main" class="sref">fanf">fan_hd1/a> && 1asrefreq_7" ="+code=maxtemp" srefreq_7" ="ss="s446">.4461/a>v.3881/a>   51/a>        1a href="allag">&quos_o_sys_fans_tick" class="allag">&quos_o_>newur>>ticks1/a> = 1;v        }v.364"
a>v.3941/a>static void 1a href="clasarm: H_smu_readjust" clasf="clasarm: Heate_c1/a>(sizeof(struct 1a hrarm: H_smu_readjust" clasrm: Heateans_state1/a> *1ascode=max_power"  rss="s446">.4461/a>vrc1/a>) {v.4341/a>        if (1aclasf="allasrm: Hs_o_sys_fans_tick" class="allasrm: Hs_o_ss="s446">.4461/a>v.4333333333             return;v.3761/a>        if (1a href="sreff="+code=max_power"  href="sreff="+css="fssetpoint1/a> = 1aNUL_FANS_INTERVAL" NUL_failent">/nt">/*!u_fans1/a> ? 1ac1/c=sensor_hd_temp" c1/c=sntrol_get_min1/a>(1ascode=max_power"  rss=""sref">st1/a>->1aclassys_fans_tick" clas>new,  ef">DBG1/a>(1spa  class="ss="-f="+c=%d RPM\n)"sref">rc1/a>) {v.4171/a>   41/a>        if (1acla">wfarm: H_smu_readjust" cla">wfarm: Hntrol_get_min1/a>(1ascode=max_power"  rss=")ure_stef">rc1/a>) {v.3881/a>          a>static void 1a href="sreff="+code=max_power"  href="sreff="+css="fsa>static void 1a code=max_power"  rss="       return;v.3911/a>        }v.364"
a>v.3761/a>        if (1a href="srefwind_smu_readjust"  href="srefwindss="fssetpoint1/a> = 1aNUL_FANS_INTERVAL" NUL_failent">/nt">/*!u_fans1/a> ? 1ac1/c=sensor_hd_temp" c1/c=sntrol_get_min1/a>(1ascode=max_power"  rss=""sref">st1/a>->1aclassys_fans_tick" clas>new,  ef">DBG1/a>(1spa  class="ss="-wind=%d RPM\n)"sref">rc1/a>) {v.40>.36.38141/a>        if (1acla">wfarm: H_smu_readjust" cla">wfarm: Hntrol_get_min1/a>(1ascode=max_power"  rss=")ure_stef">rc1/a>) {v.4231/a>          a>static void 1a href="srefwind_smu_readjust"  href="srefwindss="fsa>static void 1a code=max_power"  rss="       return;v.3911/a>        }v.3761/a>        if (1a href="hdfwind_smu_readjust"  href="hdfwindss="fssetpoint1/a> = 1aNUL_FANS_INTERVAL" NUL_failent">/nt">/*!u_fans1/a> ? 1ac1/c=sensor_hd_temp" c1/c=sntrol_get_min1/a>(1ascode=max_power"  rss=""sref">st1/a>->1aclassys_fans_tick" clas>new,  ef">DBG1/a>(1spa  class="shd-wind=%d RPM\n)"sref">rc1/a>) {v.4171/a>   41/a>        if (1acla">wfarm: H_smu_readjust" cla">wfarm: Hntrol_get_min1/a>(1ascode=max_power"  rss=")ure_stef">rc1/a>) {v.3881/a>          a>static void 1a href="hdfwind_smu_readjust"  href="hdfwindss="fsa>static void 1a code=max_power"  rss="       return;v.3911/a>        }v.364"
a>v.3761/a>        if (1a href="sreff="+code=max_power"  href="sreff="+css="f">fan_hd1/a> && 1a href="srefwind_smu_readjust"  href="srefwindss="f">fan_hd1/a> && 1a href="hdfwind_smu_readjust"  href="hdfwindss="tef">rc1/a>) {v.40>.36.381>        if (1aclasf="allasrm: Hs_o_sys_fans_tick" class="allasrm: Hs_o_ss="ur>>ticks1/a> = 1;v        }v.3541/a>v.3i1/a>        int 1aclasf="c fify_smu_readjust" clasf="c fifyeate_c1/a>(sizeof(struct 1ac fifier_blou_sys_fans_tick" c fifier_blou_eateans_state1/a> *1aself_smu_readjust"  hlf>new,ams */1/spa  v.4171/a>                  unsignf_slongsizeof(struct 1aevede=new_setpoint" evede>new, 941/ans_state1/a> *1adata=new_setpoint" datass="tef">rc1/a>) {vrc1/a>) {v.37switcha>        if (1aevede=new_setpoint" evede>new"sref">rc1/a>) {v.38casssizeof(struct 1aWF_EVENT_NEW_CONTRO_FANS_INTERVAL" WF_EVENT_NEW_CONTRO_  
L>readjust1/a>:v.3811/a>   f">max1/a> = 1a href="+code=DBG" class="sref">DBG1/a>(1spa  class="strinnew&g">"sensos detected error %d\n&readjust1/a>:v.40>.36.3811111(_c1/a>(sizeof(struct 1a hrg">&quo_smu_readjust" clag">&quoeateanst1/a>->1aclassys_fans_tick" clas>new".4231/a>   >        if (1aclass="clasg">&quo_smu_readjust" clasf="clasg">&quoeate_/spa  , (int)1adata=new_setpoint" datass="tquot;w"sre"sref">rc1/a>) 6v.38SENSOReof(struct 1aWF_EVENT_NEW_CONTRO_FANS_INTERVAL" WF_Eu_readjusq_7" ="ss="s446">.4461/a6v.3811/a>   f">max1/31/a>1shref="+code=DBG" class="sref">DBG1/a>(1spa  class="strinnew&g">"sensos detw_setpoin_7" ="ss="squot;&quo_smu_readjust" clag">&quoeateanst1/a>->1aclassys_class="6i>wf_smuur>>ticks1/a> = 16v.3941/a>      if (1aclass="clasg">&quo_smu_readjust" clasf="clasg">&quoeate_/spa  , (int)1adata=ne5ine" 58m6 
L399">.3911/a>        6v.364"
a6v.3881/a>   51/a>      /a> ? 1a href="+code=wf_smu_failu53" id 
L453" class="6ine" 653  
L435">.4341/a>        if (1aclasf="allasrm: Hs_o_sys_fans_tick" classsat">w g6 down_sD params */1/spa 6v&quoeate_/spa  , (int)1adata=ne5_setpointsss* PID params */1/spa 6vFAILURE"sref">rc1/a>) 6v : 06v.3811/a>        6v.37switcha>        if (1aevede=new7" class="7ine" 5am  
L1/a>        7vsmu_readjust" clasf="c fc     driv 
L426">.4261/a>        376" id 
L376" class="6ine" 67m  
L394DBG1/a>(1spa  class="strinnew&g">"sensos d7windfis  7ear oasD params */1/spa 7v.3941/a>static void 1a href="smu_sys_fans_tick7o keedfit7  ear_sD params */1/spa 7v ss=".3i1/a>        int 1a  
L4dbp_h81.
L371" class="6ine 
L4dbp_h81.
Lte_c1/a>(sizeof(struchdL371" class="6inhdLmu_readjust"  href="hdfwindss="fsa>static void 1a 7 classsss7sss* PID params */1/spa 7vrc1/a>) 7v"sensos detw_setpoin_7" ="ss="squot;pa 6is pres  c. Since afarm: HD temp willPID pal4782s/maa> ss=".3i1/a>5trol_get_min1/a>(1ase=new_setpoiS8SDB h6ef="TREE_IDpal4782s/maa> soiS8SDB h6ef="TREE_IDss="shdVAL" NUL_failent">/nt">/*!u_fans1/a> ? 1avers/macintosh/wind6arm_pm81.6#L364" id 
L364" 7lass="6in7" 60m  
L388">.3881/a>  751/a>70 (1a href="+code=fan_cpu_main" coin_7" ="ss="squot;pa 6is !"drivers/macintosh/wind5arm_pm81.5#L429" id 
L429" 7lass="6in7" 60m  
L399">.3911/a>  7     70if (1aclass="clasg">&class="6inhdLmu_readjust"  hrefv = 16vnew,a>st1/a>->1asf="f="+ =rs/macintosh/wind5arm_pm81.5#L429" id 
L429" 7lass="6in7" 6am  
L11/a>        }v7a hre7160">.364"
a6v = 16v.4011/a>v<7 href71/a> = 1a hrss="clase=wf"smu_sys_fans_tick" ss="refh_m>(1lfailene11/3"sref">rc1/a>) {vst1/a>->1asf="f="+code=new_setpoint" s>) {v_it">/nt">/*u_fans>) {v_itdrivers/macintosh/wind6arm_pm81.6#L446" id 
L447clalass="6in7" 61m  
L394">.3941/a>st7tic v71a>      /a> ?ers/macintosh/wind5arm_pm81.5#L4ot;rc1/a>) {v7a hre7="drivrs/macintosh/wind5arm_pm81.5#L4ot;.4341/a>  7     7f (1aclasf="alnew_setpoint" ssref">printk1/a>(1a href="+code=KERN_WARNING" class=INFOprintk1/a>(1a hlass=INFO   if ing">&qug">&ref"ng">=%d RPM\nreanreaializefreqor iMacG5 v.4251/a>  7     7       return;vrc1/a>) {v.4461/a>v<7 href7"drivers/macintosh/wind6arm_pm81.6#L417" id 
L417" 7lass="6in7" 61m  
L367">.3641/a>  7     7f (1a href="+cef="drcintosh/wind6arm_pm81.6#L364" id 
L364" class="l7lass="6in7" 61m  
L388">.3881/a>  741/a>7      ers/macintosh/wind5arm_pm81.5#L4ot;.3791/a>  7     71drivers/macintosh/wind6arm_pm81.6#L400" id 
L400" 7lass="6in7" 62m  
L380">.3811/a>  7     7v = 16vnew,ddev>        6v.4011/a>v<7 href7"driveers/macintosh/wind5arm_pm81.5#L429" id 
L429" 7lass="6in7" 622  
L376">.3761/a>  7     7f (1a hre yshe_smu_readjust" claregiststrilisref">rc1/a>) {v        7v.4231/a>  741/a>72"drivrs/macintosh/wind5arm_pm81.5#L4ot;.4333333337     7           if ef="drcintosh/wind6arm_pm81.6#L364" id 
L364" class="l7lass="6in7" 62m  
L435">.4311/a>  7     7v.4461/a>v<7 href7"drivers/macintosh/wind6arm_pm81.6#L427" id 
L427" 7lass="6in7" 62m  
L367">.3641/a>  7     7f (1asasf="c fify_smu_readjust" clasf="removks1/a> = 16v = 16vnew,ddev>        6v.3881/a>  741/a>72"drivers/macintosh/wind6arm_pm81.6#L379" id 
L379" 7lass="6in7" 62m  
L389">.3891/a>  7     72 href="+code=wf_smu_failure_staunregiststrilisref">rc1/a>) {v        7v.3811/a>  7     73drivers/macintosh/wind6arm_pm81.6#L371" id 
L371" 7lass="6in7" 63m  
L401">.4011/a>v<7 href73pa  class=Ov.3851/a>  7     73ssssssss*n  ear the&ov&igress when ef="drefreqrom claunregiststrilisre, so="drivers/macintosh/wind6arm_pm81.6#L435" id 
L435" 7lass="6in7" 63m  
L413">.4131/a>1s7a  cl7sssssssss*n0, 1, 2 and 3PID params */1/we add *n0arbitrary  {vay. I_sD pllrhave /spaix that pa  ve dorf="drivers/macintosh/wind6a5m_pm81.6#L395" id 
L395" 7lass="6in7" 63m  
L413">.4131/a>1s7a  cl7sssssssss* PID params */1/spa  vrc1/amsleen fifi1000vers/macintosh/wind6arm_pm81.6#L364" id 
L364" 7lass="6in7" 63m  
L376">.3761/a>  7     73drivers/macintosh/wind6arm_pm81.6#L427" id 
L427" 7lass="6in7" 63m  
L387">.3871/a>  761/a>7       if (1a awindfss=dition detected,ReleS_IND pav.3881/a>  7     73pa  class=If elassms fsref">w m>(1,   Onrrefre drappy raceeandear_sD parthink/we have any guarantee */1/="drivers/macintosh/wind6arm_pm81.6#L435" id 
L435" 7lass="6in7" 63m  
L389">.3891/a>  7     73ssssssss*ng">snow)full".PID paramthat  ve atef"bute inneback war_sD parrace with  ve " ="ss=bee hrefdrivers/macintosh/wind6arm_pm81.6#L435" id 
L435" 7lass="6in7" 64m  
L380">.3811/a>  7     74ssssssss* PID params */1/spa  v.4011/a>v<7 href74ssssssss*n_and_ID  otherfsref">w is prwith  vat except by addefre    sND pa1afa... I_sD pllrdo  vat="drivers/macintosh/wind6arm_pm81.6#L402" id 
L402" 7lass="6in7" 642  
L376">.3761/a>  7     74ssssssss*n  ear the&ov.4231/a>  741/a>74ssssssss* PID params */1/spa  v.4333333337     7           if eff="+code=max_power"  href="sreff="+css="f">fan_hd1/a> && 1a ers/macintosh/wind5arm_pm81.5#L433" id 
L433437lass="6in7" 64m  
L435">.4311/a>  7     74f">rc1/a>) 6v(puwfarm: Hcode=KERN_WARNING" cr"  href="sreff="+css="f">fan_hd1/a> && 1a eers/macintosh/wind6arm_pm81.6#L364" id 
L364" 7lass="6in7" 64m  
L446">.4461/a>v<7 href74 (1a href="sreff="+code=max_power"  href="sefwindss="f">fan_hd1/a> && 1a ers/macintosh/wind5arm_pm81.5#L433" id 
L433437lass="6in7" 64m  
L367">.3641/a>  7     74      1a hr  ear"ov(puwfarm: Hcode=KERN_WARNING" cr"  href="sefwindss="f">fan_hd1/a> && 1a eers/macintosh/wind6arm_pm81.6#L364" id 
L364" 7lass="6in7" 64m  
L388">.3881/a>  751/a>74 (1a href="+code=fan_cpu_main" c  href="hdfwindss="tef">rc1/a>) {v        }v7a hre74if (1aclass="clasg">&quo_smu_readjust" puwfarm: Hntrol_get_min1/a>(puwfarm: Hcode=KERN_WARNING" cr"  hre"hdfwindss="tef">rc1/a>) {v.364"
a>v<7 href7"drivers/macintosh/wind6arm_pm81.6#L451" id 
L451" 7lass="6in7" 65m  
L394">.3941/a>st7tic v75pa  class=Ovrc1/a>) {v7a hre75 (1a hreho_smu_cpu_fans"  hreho>fanf="sref">fan_uot;.4341/a>  7     75  if (1aclass="clasg">&quo_smu_readjustpuwf"clasg">&quoeate_/spa  , puwf"clasg"code=KERN_WARNING" class="sref">fan_cpu_main1/a>);v.4333333337     75          if eff="+code=max_powefan_uot;rc1/a>) 6v&quoeate_/spa  , puwf"clasg"code=KERN_WARNING" classcpu_main1/a>);v.3761/a>  7     7f (1a href="sreff="+code=max_powee yshefss="s446">.4461/a>v.4171/a>  741/a>7       if (1acla">wfarfan_cpu_main" c clpuwf"clasg">&quoeate_/spa  , puwf"clasg"code=KERN_WARNING" classhefss="squot;.3881/a>  7     75 (1a href="+code=fan_cpu_main" csrefreq_7" ="ss="s446">.4461/a>v.3911/a>  7     75if (1aclass="clasg">&quo_smu_readjust" puwf"clasg">&quoeate_/spa  , puwf"clasg"code=KERN_WARNING" csrefreq_7" ="ss="squot;.364"
a>v<7 href7"drivers/macintosh/wind6arm_pm81.6#L361" id 
L361" 7lass="6in7" 661  
L376">.3761/a>  7     76pa  class=Ov ?&class=ure ref="drivers/macintosh/wind5arm_pm81.5#L394" id 
L394" 7lass="6in7" 66m  
L402">.40>.36.38741/a>76 (1a hre yshe_smu_readjust" kfreks1/a> = 16v        7v)ys_rams"drivers/macintosh/wind5arm_pm81.5#L388" id 
L388" 7lass="6in7" 66m  
L423">.4231/a>  7     7 a>static void_smu_readjust" kfreks1/a> = 16v        7v.3911/a>  7     76drivers/macintosh/wind6arm_pm81.6#L375" id 
L375" 7lass="6in7" 66m  
Lams */1/spa  v<7 href76f">rc1/a>) 6vef="drcintosh/wind6arm_pm81.6#L364" id 
L364" class="l7lass="6in7" 66m  
L376">.3761/a>  7     7f (1a ers/macintosh/wind5arm_pm81.5#L4ot;.4171/a>  741/a>7      rs/macintosh/wind5arm_pm81.5#L4ot;.3881/a>  7     7 a>sta433ass="ys_fans_tick" class="platqorm_dh/wins1/a> = 16v = 16vsmu_readjustlass="6in7" 66m  
L399">.3911/a>  7     7v.364"
a>v<7 href77    376" id 
L376" class="6inremovks1/a> = 16v = 16v.3761/a>  7     7f (1a href="srL376" class="6indh/wins1/a> = 16vsmu_readjustlass="6in7" 67m  
L402">.40>.36.387>    7   if (1aclasf="allasrL376" class="6ineicks1/a> = 16v&qug">&ref"ng">=%d RPM\nr1a href="+coders/macintosh/wind5arm_pm81.5#L4ot;        }v7a hre77  if (1aclass="clasg"L376" class="6inownins1/a> = 16v = 16v.3541/a>v<7 href77.3i1/a>   7    i77drivers/macintosh/wind6arm_pm81.6#L427" id 
L427" 7lass="6in7" 67m  
L417">.4171/a>  7     77     rs/macintosh/wind5arm_pm81.5#L4ot;rc1/a>) {v7a hre77a>sta433ass=fify_smu_readjust" _a 7v = 16v = 16v.37switcha7     7  if (ers/maref="+code=pid" lasf="c fc5">smu_readjustlass="6in7" 6am  
L380">.38casssiz7of(st7uct 1aWF_EVENTfify_smu_readjust" rcs1/a> = 16v = 16v.3811/a>  7f">ma78drivers/macintosh/wind6arm_pm81.6#L442" id 
L442" 7lass="6in7" 68m  
L402">.40>.36.3871111(78 (1a hreho_smu_cpu_fans"  hreho>of>rc1/">._isf"cmp3asblks1/a> = 16vrc1/">._isf"cmp3asblkcode=King">&qug">&ref"ng">=%Pamp;Mac8,1 {v.4231/a>  7>    7   if (1aclass="clu_fans"  hreho>of>rc1/">._isf"cmp3asblks1/a> = 16vrc1/">._isf"cmp3asblkcode=King">&qug">&ref"ng">=%Pamp;Mac8,2 {v = 16vw7sre"s78drivers/mawind6a3651/a>        1a href="+code=wf_s7ass="6ine7 6am  
L380">.38SENSOReo7(stru78 (1a href="sreff="+code=max_powercs1/a> = 16v.3811/a>  7f">ma71/31/a#ifdefu (1aevede=new7"MODULEs1/a> = 16v&qug">&ref"ng">=%#L429" id  7v<        {v.3941/7>    7 if (1aclass="clasg">&quo_smu_readjusrequest_modules1/a> = 16v&qug">&ref"ng">=%#L429" id  7vv.364"
a6v&quo_s  
L41>.3881/aosh/wind6arm_pm81.6#L363" 21quo_smo_s  
L41>.3881=%#L429" id 8d_smu_readjust"  href="srefwindss="fssetp1=%#L429" iL448" id 
L44" id 
L388" 7ew_setpm_725" id 
L" class="6ine" 7
L3607360">.36smu_readjKclass="6ine" 6am  
L3807TICKe79}51/a>        1a href="+code=wf_smu_readjust" c7m: 3" class=76ine" 653  
L435">.4341/7>    7   if #endtostosh/wind5arm_pm81.5#L388eff="+364"
a>v<7 href7"drivers/macintosh/wind6arm_pm81.6#L361"d 
L433437 id 
L443" class="5ine" 74m  
79ks1/a> = 16vrc1/">._isf"cmp3a6m  
L417">.4172m  
L401i7lass="6in7" 66m  
L417">.4172m  
L401 741/a>72"drivers/macintosh/windtosh/wind5arm_pm81.5#L4ot;.36.5#L389" ams */1/spa 6vfanfs          if (1ase=new_setpoi7s="sre6">7AILURE"sref">rc1/a>) 6v<7 h69f79veers/macintosh/wind5arm_pm81.5#L4ot;.36ntosh/winfanf= 2quot; : 06v<7 h69f79rcintosh/wind6arm_pm81.6#L364" id 
L364" class="l7833ass="ys8fans_tick" class="+rass=8y89" 80    ers/macintosh/wind6arm_pm81.__ex427" id 
L427" 7lasex42in7" 67m  
L417">.4171/a>  ex427" id 
L427" 7l71/a>  ex425arm_pm81.5#L4ot;rc8     376"8id 
L376" class="6ine" 68m  
L80ick"platqorm_devicks1/a> = 16v = 16v.4172inneback ii7lass="6in7" 66m  
L417">.4172inneback i 741/a>72"drivers/macintosh/windtosh/wind5arm_pm81.5#L4ot;.881init" i8 
L376" class="6iinit" i8 
L398">.3946arm_pm81.6#L417" id 
L417" 7lass="6in7" 61m  8edfit7  e8r_sD params */1/spa 7v = 16v(siz8of(struchdL371" class="68nhdLm8_readjust"  href="hdfwindss="fsa>static void 1a 7 c8asssss7ss8* PID params */1/spa 7v<8 h70f8"drivedrivers/macintodjust" 7     77     rs/macdjust" 7    )ys_rams 5am  
L1/a>      7     77     rs/macintosh/wind5armew_setpm_725" id 
L" class="6ine" 7
L3607360">.888ssss7ss8*anf= 2quot;      ex427" id 
L427" 7l71/a>  ex425armew_setpm_725" id 
L" class="6ine" 7
L3607360">.889ssss7ss8*ruw"srearget1/a> : 06v<8ss="680rcintosh/wind6arm_pm81.6#L364" id 
L364" class="l78 (1aclass8"clasg">&class="6inhdLmu8readj8st"  h80">.38SENSOReo7(stru_AUTHclass="6ef">w"sre7(stru_AUTHcl  href="srefwindss="fssetp1=%Benjamin Herr#L3chmidt <benh@kernel.crashsse.org" id" id 
L388" 7ew_setpm_725" id 
L" class="6ine" 7
L3607360">.8========q8o_smu_readjust" clag"st"8 href8.38SENSOReo7(stru_DESCRIPTIONass="6ef">w"sre7(stru_DESCRIPTION  href="srefwindss="fssetp1=%Thermal388" 7lass=gaci434">.43 G5" id 
L388" 7ew_setpm_725" id 
L" class="6ine" 7
L3607360">.8=s  7ear 8lfailene11/3"sref">rc1/a8) {v<8 hrpre80">.38SENSOReo7(stru_LICENSu78 (1a href="sreff="+_LICENSu  href="srefwindss="fssetp1=%GPL" id 
L388" 7ew_setpm_725" id 
L" class="6ine" 7
L3607360">.8=D tem7 w8">/nt">/*u_fans>) {v_itd8ivers8macint80">.38SENSOReo7(stru_ALIASass="6ef">w"sre7(stru_ALIAS  href="srefwindss="fssetp1=Ÿm  
L41:rivers/maref="+code=pew_setpm_725" id 
L" class="6ine" 7
L3607360">.8=1init" i8394">.3941/a>st7tic v71a8     8/a> ?e


.3941/fook ii> The original3LXR software00 */1setpm_725http://source L4ge.net/projects/lxii>LXR _pm8uindmu_rea.. I_sexperi81.5al3d Lion00 setpm_725mailto:lxi@a>sux.no">lxi@a>sux.nou_re. .3941/subfook ii> lxi.a>sux.no ke" ly hock d00 setpm_725http://www.redpill-a>spro.no">Redpill L>spro AS hr,parhvider of L>suxtosh/ult cerck w1" ca" cls ser7" 7s since 1995.