linux/drivers/hwmon/smsc47m1.c
<<
>>
Prefs
   1/*
   2 * smsc47m1.c - Part of lm_sensors, Linux kernel modules
   3 *              for hardware monitoring
   4 *
   5 * Supports the SMSC LPC47B27x, LPC47M10x, LPC47M112, LPC47M13x,
   6 * LPC47M14x, LPC47M15x, LPC47M192, LPC47M292 and LPC47M997
   7 * Super-I/O chips.
   8 *
   9 * Copyright (C) 2002 Mark D. Studebaker <mdsxyz123@yahoo.com>
  10 * Copyright (C) 2004-2007 Jean Delvare <khali@linux-fr.org>
  11 * Ported to Linux 2.6 by Gabriele Gorla <gorlik@yahoo.com>
  12 *                      and Jean Delvare
  13 *
  14 * This program is free software; you can redistribute it and/or modify
  15 * it under the terms of the GNU General Public License as published by
  16 * the Free Software Foundation; either version 2 of the License, or
  17 * (at your option) any later version.
  18 *
  19 * This program is distributed in the hope that it will be useful,
  20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22 * GNU General Public License for more details.
  23 *
  24 * You should have received a copy of the GNU General Public License
  25 * along with this program; if not, write to the Free Software
  26 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  27 */
  28
  29#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  30
  31#include <linux/module.h>
  32#include <linux/slab.h>
  33#include <linux/ioport.h>
  34#include <linux/jiffies.h>
  35#include <linux/platform_device.h>
  36#include <linux/hwmon.h>
  37#include <linux/hwmon-sysfs.h>
  38#include <linux/err.h>
  39#include <linux/init.h>
  40#include <linux/mutex.h>
  41#include <linux/sysfs.h>
  42#include <linux/acpi.h>
  43#include <linux/io.h>
  44
  45static unsigned short force_id;
  46module_param(force_id, ushort, 0);
  47MODULE_PARM_DESC(force_id, "Override the detected device ID");
  48
  49static struct platform_device *pdev;
  50
  51#define DRVNAME "smsc47m1"
  52enum chips { smsc47m1, smsc47m2 };
  53
  54/* Super-I/0 registers and commands */
  55
  56#define REG     0x2e    /* The register to read/write */
  57#define VAL     0x2f    /* The value to read/write */
  58
  59static inline void
  60superio_outb(int reg, int val)
  61{
  62        outb(reg, REG);
  63        outb(val, VAL);
  64}
  65
  66static inline int
  67superio_inb(int reg)
  68{
  69        outb(reg, REG);
  70        return inb(VAL);
  71}
  72
  73/* logical device for fans is 0x0A */
  74#define superio_select() superio_outb(0x07, 0x0A)
  75
  76static inline void
  77superio_enter(void)
  78{
  79        outb(0x55, REG);
  80}
  81
  82static inline void
  83superio_exit(void)
  84{
  85        outb(0xAA, REG);
  86}
  87
  88#define SUPERIO_REG_ACT         0x30
  89#define SUPERIO_REG_BASE        0x60
  90#define SUPERIO_REG_DEVID       0x20
  91#define SUPERIO_REG_DEVREV      0x21
  92
  93/* Logical device registers */
  94
  95#define SMSC_EXTENT             0x80
  96
  97/* nr is 0 or 1 in the macros below */
  98#define SMSC47M1_REG_ALARM              0x04
  99#define SMSC47M1_REG_TPIN(nr)           (0x34 - (nr))
 100#define SMSC47M1_REG_PPIN(nr)           (0x36 - (nr))
 101#define SMSC47M1_REG_FANDIV             0x58
 102
 103static const u8 SMSC47M1_REG_FAN[3]             = { 0x59, 0x5a, 0x6b };
 104static const u8 SMSC47M1_REG_FAN_PRELOAD[3]     = { 0x5b, 0x5c, 0x6c };
 105static const u8 SMSC47M1_REG_PWM[3]             = { 0x56, 0x57, 0x69 };
 106
 107#define SMSC47M2_REG_ALARM6             0x09
 108#define SMSC47M2_REG_TPIN1              0x38
 109#define SMSC47M2_REG_TPIN2              0x37
 110#define SMSC47M2_REG_TPIN3              0x2d
 111#define SMSC47M2_REG_PPIN3              0x2c
 112#define SMSC47M2_REG_FANDIV3            0x6a
 113
 114#define MIN_FROM_REG(reg, div)          ((reg) >= 192 ? 0 : \
 115                                         983040 / ((192 - (reg)) * (div)))
 116#define FAN_FROM_REG(reg, div, preload) ((reg) <= (preload) || (reg) == 255 ? \
 117                                         0 : \
 118                                         983040 / (((reg) - (preload)) * (div)))
 119#define DIV_FROM_REG(reg)               (1 << (reg))
 120#define PWM_FROM_REG(reg)               (((reg) & 0x7E) << 1)
 121#define PWM_EN_FROM_REG(reg)            ((~(reg)) & 0x01)
 122#define PWM_TO_REG(reg)                 (((reg) >> 1) & 0x7E)
 123
 124struct smsc47m1_data {
 125        unsigned short addr;
 126        const char *name;
 127        enum chips type;
 128        struct device *hwmon_dev;
 129
 130        struct mutex update_lock;
 131        unsigned long last_updated;     /* In jiffies */
 132
 133        u8 fan[3];              /* Register value */
 134        u8 fan_preload[3];      /* Register value */
 135        u8 fan_div[3];          /* Register encoding, shifted right */
 136        u8 alarms;              /* Register encoding */
 137        u8 pwm[3];              /* Register value (bit 0 is disable) */
 138};
 139
 140struct smsc47m1_sio_data {
 141        enum chips type;
 142        u8 activate;            /* Remember initial device state */
 143};
 144
 145
 146static int __exit smsc47m1_remove(struct platform_device *pdev);
 147static struct smsc47m1_data *smsc47m1_update_device(struct device *dev,
 148                int init);
 149
 150static inline int smsc47m1_read_value(struct smsc47m1_data *data, u8 reg)
 151{
 152        return inb_p(data->addr + reg);
 153}
 154
 155static inline void smsc47m1_write_value(struct smsc47m1_data *data, u8 reg,
 156                u8 value)
 157{
 158        outb_p(value, data->addr + reg);
 159}
 160
 161static struct platform_driver smsc47m1_driver = {
 162        .driver = {
 163                .owner  = THIS_MODULE,
 164                .name   = DRVNAME,
 165        },
 166        .remove         = __exit_p(smsc47m1_remove),
 167};
 168
 169static ssize_t get_fan(struct device *dev, struct device_attribute
 170                       *devattr, char *buf)
 171{
 172        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 173        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 174        int nr = attr->index;
 175        /*
 176         * This chip (stupidly) stops monitoring fan speed if PWM is
 177         * enabled and duty cycle is 0%. This is fine if the monitoring
 178         * and control concern the same fan, but troublesome if they are
 179         * not (which could as well happen).
 180         */
 181        int rpm = (data->pwm[nr] & 0x7F) == 0x00 ? 0 :
 182                  FAN_FROM_REG(data->fan[nr],
 183                               DIV_FROM_REG(data->fan_div[nr]),
 184                               data->fan_preload[nr]);
 185        return sprintf(buf, "%d\n", rpm);
 186}
 187
 188static ssize_t get_fan_min(struct device *dev, struct device_attribute
 189                           *devattr, char *buf)
 190{
 191        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 192        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 193        int nr = attr->index;
 194        int rpm = MIN_FROM_REG(data->fan_preload[nr],
 195                               DIV_FROM_REG(data->fan_div[nr]));
 196        return sprintf(buf, "%d\n", rpm);
 197}
 198
 199static ssize_t get_fan_div(struct device *dev, struct device_attribute
 200                           *devattr, char *buf)
 201{
 202        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 203        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 204        return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[attr->index]));
 205}
 206
 207static ssize_t get_fan_alarm(struct device *dev, struct device_attribute
 208                             *devattr, char *buf)
 209{
 210        int bitnr = to_sensor_dev_attr(devattr)->index;
 211        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 212        return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
 213}
 214
 215static ssize_t get_pwm(struct device *dev, struct device_attribute
 216                       *devattr, char *buf)
 217{
 218        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 219        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 220        return sprintf(buf, "%d\n", PWM_FROM_REG(data->pwm[attr->index]));
 221}
 222
 223static ssize_t get_pwm_en(struct device *dev, struct device_attribute
 224                          *devattr, char *buf)
 225{
 226        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 227        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 228        return sprintf(buf, "%d\n", PWM_EN_FROM_REG(data->pwm[attr->index]));
 229}
 230
 231static ssize_t get_alarms(struct device *dev, struct device_attribute
 232                          *devattr, char *buf)
 233{
 234        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 235        return sprintf(buf, "%d\n", data->alarms);
 236}
 237
 238static ssize_t set_fan_min(struct device *dev, struct device_attribute
 239                           *devattr, const char *buf, size_t count)
 240{
 241        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 242        struct smsc47m1_data *data = dev_get_drvdata(dev);
 243        int nr = attr->index;
 244        long rpmdiv;
 245        long val;
 246        int err;
 247
 248        err = kstrtol(buf, 10, &val);
 249        if (err)
 250                return err;
 251
 252        mutex_lock(&data->update_lock);
 253        rpmdiv = val * DIV_FROM_REG(data->fan_div[nr]);
 254
 255        if (983040 > 192 * rpmdiv || 2 * rpmdiv > 983040) {
 256                mutex_unlock(&data->update_lock);
 257                return -EINVAL;
 258        }
 259
 260        data->fan_preload[nr] = 192 - ((983040 + rpmdiv / 2) / rpmdiv);
 261        smsc47m1_write_value(data, SMSC47M1_REG_FAN_PRELOAD[nr],
 262                             data->fan_preload[nr]);
 263        mutex_unlock(&data->update_lock);
 264
 265        return count;
 266}
 267
 268/*
 269 * Note: we save and restore the fan minimum here, because its value is
 270 * determined in part by the fan clock divider.  This follows the principle
 271 * of least surprise; the user doesn't expect the fan minimum to change just
 272 * because the divider changed.
 273 */
 274static ssize_t set_fan_div(struct device *dev, struct device_attribute
 275                           *devattr, const char *buf, size_t count)
 276{
 277        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 278        struct smsc47m1_data *data = dev_get_drvdata(dev);
 279        int nr = attr->index;
 280        long new_div;
 2"> 180 err" class="sref">err;
datmon/> 192      ="L19d="L276" class="line" 4ong _tm"/a>;
 128        u8 nolddiv"/a> = DIV_FROM_REG(data->fan_div[nr]);
 128
 125        ra href="+code=err" class="sref">err = kstrtol(buf, 10, &new_div;;
 128        in (err)
 128                return -ss="comment"> err" class="sref">err;
 128
 128        if (new_div;== 0a href="+code=folddiv" class="sref">nolddiv"/a> )/* RN change j/
 129                return count;
 129
 129        mutex_lock(&data->update_lock);
 123        iswitch(new_div; {
 124        icase 1
 125                 a href="+code=data" class="sref">data->fan_div[nr])= <0
 129                 1297/a>        icase 2
 129                 a href="+code=data" class="sref">data->fan_div[nr])= <1
 129                 break
 230         case 4
 2301/a>                 a href="+code=data" class="sref">data->fan_div[nr])= <2
 230                 break
 233        scase 8
 230                 a href="+code=data" class="sref">data->fan_div[nr])= <3
 230                 break
 230         default
 230                ra href="+code=mutex_unlock" class="sref">mutex_unlock(&data->update_lock);
 238                 eturn -EINVAL;
 230         
 231
 231        stwitch(nr] {
 232        rcase 0
 231        scase 1
 231                 a href="+code=dtm" class="sref">_tm"/a>;= smsc47m1_wreadvalue"/a>(data, SMSC47M1_REG_FAN_DIV/a>)
 231                       amp; 1~(0x03 << (4 +2 * nr] ;
 236                 a href="+code=dtm" class="sref">_tm"/a>;=| data->fan_div[nr])=<< (4 +2 * nr] 
 231                ra href="+code=mmsc47m1_write_value" class="sref">smsc47m1_write_value(data, SMSC47M1_REG_FAN_DIV/a>) _tm"/a>; 
 231                 break
 239        scase 2
 232                ra href="+code=dtm" class="sref">_tm"/a>;= smsc47m1_wreadvalue"/a>(data, SMSC47M12REG_FAN_DIV3/a>] {amp; 0x7CF
 2321/a>                 a href="+code=dtm" class="sref">_tm"/a>;=| data->fan_div[<2)=<< 4
 232                 a href="+code=mmsc47m1_write_value" class="sref">smsc47m1_write_value(data, SMSC47M12REG_FAN_DIV3/a>] _tm"/a>; 
 232                 break
 234         
 235{ 236        sspan class="comment">/* RPreserv fan minij/
 237        sa href="+code=dtm" class="sref">_tm"/a>;= <92 - ((a href="+code=folddiv" class="sref">nolddiv"/a> =* (92 - (a href="+code=deta" class="sref">data->fan_preload[nr]); 232                       new_div;= 2) / new_div;
 2329/a>        sa href="+code=deta" class="sref">data->fan_preload[nr])= SMENSORS_LIMIT/a>(_tm"/a>;, 0,191< 
 233        smsc47m1_write_value(data, SMSC47M1_REG_FAN_PRELOAD[nr],
 2331/a>                              a href="+code=meta" class="sref">data->fan_preload[nr]) 
 233        mutex_unlock(&data->update_lock);
 233{ 234        seturn count;
 233}
 233
 233static ssize_t gst_pwm(struct device *dev, struct device_attribute
 233                        devattr, const char *buf, size_t count)
 233{
 234        sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 231        struct smsc47m1_data *data = dev_get_drvdata(dev);
 232        snt nr = attr->index;
 233        iong val;
 234        l class="comment"> err" class="sref">err;
 234{ 236        iss="comment"> err" class="sref">err;= kstrtol(buf, 10, &val);
 234        sn (err)
 234                 eturn -ss="comment"> err" class="sref">err;
 234
 230         n (val *< 0|| 2a href="+code=eal" class="sref">val *&t; 9255
 2351/a>                 eturn -EINVAL;
 235
 233        mutex_lock(&data->update_lock);
 2354/a>        data->pwm[nr])=∓<= 0x81;sspan class="comment">/* RPreserv fadditional bts v/
 235        ra href="+code=eata" class="sref">data->pwm[nr])=| PWM_ETOREG"/a>(val);
 235        iss="comment"> emsc47m1_write_value" class="sref">smsc47m1_write_value(data, SMSC47M1_REG_FWM_/a>[nr],
 237                rrrrrrrrrrrrrra href="+code=eata" class="sref">data->pwm[nr]);
 235        mutex_unlock(&data->update_lock);
 239
 236        return count;
 236}
 236
 236static ssize_t gst_pwm_en(struct device *dev, struct device_attribute
 236                          *devattr, chnst char *buf, size_t count)
 236{
 236        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 236        struct smsc47m1_data *data = dev_get_drvdata(dev);
 236        nr = attr->index;
 2369/a>        sunsiged iong val;
 237        int err;
 237
 237        err;= kstrtolu(buf, 10, &val);
 237        in (err)
 237                 eturn -ss="comment"> err" class="sref">err;
 237{ 237        in (val *&t; 91
 237                return -EINVAL;
 237
 2379/a>        sa href="+code=dutex_lock" class="sref">mutex_lock(&data->update_lock);
 238        data->pwm[nr])=∓<= 0xFE;sspan class="comment">/* Rpreserv fhe dohe r bts v/
 23> 180data->pwm[nr])=|= !a href="+code=val" class="sref">val;
datm3n/> 192      ="L19d=3L276"38        smsc47m1_write_value(data, SMSC47M1_REG_FWM_/a>[nr],
 138                              a href="+code=eata" class="sref">data->pwm[nr]);
 1384/a>        mutex_unlock(&data->update_lock);
 138{ 138        ieturn count;
 138 
 138
 138 #defne"can_prelset"/a>(coffse"/a>);                                             \ 139 tatic SMENSOR_DEVICE_ATTR/a>(can_/a> ##offse"##_input SM_IRUGO/a>, Sgt_fan_/a>, <       \ 1391/a>                 a href="+code=dNUL" class="sref">ENUL"/a>, coffse"/a>) -91
;                                      \datm32" class="line" name="L132"> 139 tatic SMENSOR_DEVICE_ATTR/a>(can_/a> ##offse"##_min SM_IRUGO/a>,  2a href="+code=eM_IWUSR class="sref">SM_IWUSR/a>, <        \ 139                 a href="+code=Sgt_fan_min" class="sref">sgt_fan_min( set_fan_min( coffse"/a>) -91
;                  \ 139static SMENSOR_DEVICE_ATTR/a>(can_/a> ##offse"##_div SM_IRUGO/a>,  2a href="+code=eM_IWUSR class="sref">SM_IWUSR/a>, <        \ 135                 a href="+code=dgt_fan_div" class="sref">sgt_fan_div( set_fan_div( coffse"/a>) -91
;                  \ 139 tatic SMENSOR_DEVICE_ATTR/a>(can_/a> ##offse"##_larms SM_IRUGO/a>, sgt_fan_dlarms/a>, < \ 139                ra href="+code=mNUL" class="sref">ENUL"/a>, coffse"/a>) -91
;                                      \ 139static SMENSOR_DEVICE_ATTR/a>(pwm[##offse" SM_IRUGO/a>,  2a href="+code=eM_IWUSR class="sref">SM_IWUSR/a>, <              \ 139                 a href="+code=Sgt_fwm" class="sref">pgt_pwm( gst_pwm( coffse"/a>) -91
;                          \ 240 tatic SMENSOR_DEVICE_ATTR/a>(pwm[##offse"##_enable SM_IRUGO/a>,  2a href="+code=eM_IWUSR class="sref">SM_IWUSR/a>, <     \ 2401/a>                 a href="+code=dgt_pwm_en" class="sref">ggt_pwm_en( gst_pwm_en( coffse"/a>) -91
 240
 243 a href="+code=san_prelset" class="sref">can_prelset"/a>(<< 
 240 a href="+code=san_prelset" class="sref">can_prelset"/a>(<2 
 240 a href="+code=san_prelset" class="sref">can_prelset"/a>(<3 
 240
 240static SDEVICE_ATTR/a>(atarmss/a>, SM_IRUGO/a>, agt_flarmss/a>, ENUL"/a>, 
 240
 240 tatic ssize_t sshow_ame=/a>(device *dev, struct device_attribute
 241                rrrrrrrrrrdevattr, char *buf,
 241 
 242        rtruct smsc47m1_data *data = dev_get_drvdata(dev);
 241{ 241        seturn bsrinct"/a>(buf, "%s\n"/span>
 data->same=/a>(;
 241}
 241 tatic SDEVICE_ATTR/a>(same=/a>( SM_IRUGO/a>, sshow_ame=/a>( ENUL"/a>, 
 241
 241static dttribute *smsc47m1_dttribute[<)= <
 249        samp;gstsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 242         amp;setsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 2421/a>         amp;setsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 242         amp;sensor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 242        ENUL"/a>, 244 }
 245{ 242 tatic _ttribute"_grou"/a> smsc47m1_dgrou"fan_1/a> = <
 247        s.a href="+code=sttr"s class="sref">attr"s/a> = smsc47m1_dttribute[
 242 }
 242
 2430/a>static dttribute *smsc47m1_dttribute[<)= <
 2431/a>         amp;gstsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 243         amp;setsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 2433/a>         amp;setsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 244        samp;sensor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 243        ra href="+code=eNUL" class="sref">ENUL"/a>, 243
}
 243
 2438/a> tatic _ttribute"_grou"/a> smsc47m1_dgrou"fan_2/a> = <
 2439/a>        s.a href="+code=sttr"s class="sref">attr"s/a> = smsc47m1_dttribute[
 244 }
 244
 2442/a>static dttribute *Smsc47m1_dttribute[<)= <
 2443/a>         amp;gstsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 244        samp;setsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 2445/a>        samp;setsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 246        iamp;sensor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 244        sa href="+code=dNUL" class="sref">ENUL"/a>, 244 }
 244
 2450/a> tatic _ttribute"_grou"/a> Smsc47m1_dgrou"fan_3/a> = <
 2451/a>         .a href="+code=sttr"s class="sref">attr"s/a> = Smsc47m1_dttribute[
 245
}
 245{ 2454/a>static dttribute *smsc47m1_dttribute[<)= <
 2455/a>        samp;smnsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 245        iamp;smnsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 245        sa href="+code=dNUL" class="sref">ENUL"/a>, 245 }
 249
 2460/a> tatic _ttribute"_grou"/a> smsc47m1_dgrou"fpwm1/a> = <
 2461/a>         .a href="+code=sttr"s class="sref">attr"s/a> = smsc47m1_dttribute[
 246
}
 246{ 2464/a>static dttribute *smsc47m1_dttribute[<)= <
 2465/a>        samp;smnsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 246        iamp;smnsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 246        sa href="+code=dNUL" class="sref">ENUL"/a>, 246 }
 246
 2470/a> tatic _ttribute"_grou"/a> smsc47m1_dgrou"fpwm2/a> = <
 2471/a>         .a href="+code=sttr"s class="sref">attr"s/a> = smsc47m1_dttribute[
 247
}
 247{ 2474/a>static dttribute *Smsc47m1_dttribute[<)= <
 2475/a>        samp;Smnsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 247        iamp;smnsor_dev_attr .a href="+code=sev_gttr" class="sref">devaattr(.a href="+code=sttr" class="sref">attr-
 247        sa href="+code=dNUL" class="sref">ENUL"/a>, 247 }
 247
 2480/a> tatic _ttribute"_grou"/a> Smsc47m1_dgrou"fpwm3/a> = <
 2481/a>         .a href="+code=sttr"s class="sref">attr"s/a> = Smsc47m1_dttribute[
datm4n/> 192      ="L19d=4L276"48
}
 148{ 1484/a>static dttribute *Smsc47m1_dttribute[<)= <
 1485/a>        samp;aev_attr(.a href="+code=sttr" class="sref">attr-
 148        iamp;sev_attr(.a href="+code=sttr" class="sref">attr-
 148        sa href="+code=dNUL" class="sref">ENUL"/a>, 148 }
 148
 1490/a> tatic _ttribute"_grou"/a> Smsc47m1_dgrou"/a> = <
 1491/a>         .a href="+code=sttr"s class="sref">attr"s/a> = Smsc47m1_dttribute[
datm42" class="line" name="L142"> 149
}
 149{ 149static g__init/a> fssc47m1_dfin"/a> smsc47m1_dsiodata"/a> *smiodata"/a> 
 149{
 149        iss="comment"> eu8 class="sref">su8/a> val;
 149         unsiged ishor atdd"/a>;
 149
 1499/a>        sa href="+code=dsuperiodente" class="sref">asuperiodente"/a> < 
 250        val * faorce_i"/a> *?faorce_i"/a> *:sa href="+code=dsuperiodinb class="sref">asuperiodinb/a> aSUPERIOREG"_DEVID/a> 

 250
 250        /* /span>
 253 apan class="comment">/       < * MSC4 LPC7M1_0x/LPC7M1_12/LPC7M1_3x (evice_id= 0x59), LPC7M1_4x/span>
 250 apan class="comment">/       < * (evice_id= 0x5F) and LPC7MB27x (evice_id= 0x51) have fn clontrol./span>
 250 apan class="comment">/       < * The LPC7M1_5x and LPC7MM192 chips "with hardware on/itouing bock<"/span>
 250
apan class="comment">/       < * cn cdo much onre besides (evice_id= 0x60)./span>
 250sapan class="comment">/       < * The LPC7M1997 is undocuent"ed, ute seems to beclompticble with/span>
 250
apan class="comment">/       < * the LPC7M1_92, and has the sme= evice_id=./span>
 250 apan class="comment">/       < * The LPC7M1292 (evice_id= 0x6B) is somewhatclompticble, ute it/apan>
 251 apan class="comment">/       < * suppor s a 3rd fn , and the pi clonfiguration registe"s are/apan>
 251 apan class="comment">/       < * unaortunately differnt"./span>
 252 apan class="comment">/       < * The LPC7M1233 has the sme= evice_id= (0x6B) ute is notclompticble./span>
 251 apan class="comment">/       < * Weclheck the high bts of the evice_irvicsion registe" to/span>
 251 apan class="comment">/       < * differnt"iate them./span>
 251 apan class="comment">/       < *
 251        stwitch val);<
 251         case 0x51: 251                 a href="+code=bprdinfo class="sref">vprdinfo/a> "Found MSC4 LPC7MB27x\n"/span>


 251                 a href="+code=Smiodata" class="sref">smiodata"/a> >styp=/a> = smsc47m1_/a>;
 252                rbreak
 2521/a>         case 0x59: 252                 a href="+code=bprdinfo class="sref">vprdinfo/a> "Found MSC4 LPC7M1_0x/LPC7M1_12/LPC7M1_3x\n"/span>


 252                 a href="+code=Smiodata" class="sref">smiodata"/a> >styp=/a> = smsc47m1_/a>;
 252                 break
 2525/a>         case 0x5F: 2526/a>                 a href="+code=bprdinfo class="sref">vprdinfo/a> "Found MSC4 LPC7M1_4x\n"/span>


 252                ra href="+code=mmiodata" class="sref">smiodata"/a> >styp=/a> = smsc47m1_/a>;
 252                 break
 2529/a>         case 0x60: 253                ra href="+code=bprdinfo class="sref">vprdinfo/a> "Found MSC4 LPC7M1_5x/LPC7M1_92/LPC7M1997\n"/span>


 2531/a>                 a href="+code=dmiodata" class="sref">smiodata"/a> >styp=/a> = smsc47m1_/a>;
 253                 break
 2533/a>         case 0x6B: 253                 n (asuperiodinb/a> aSUPERIOREG"_DEVREV/a>); 253        r               ra href="+code=bprddebug class="sref">vprddebug/a> "Found MSC4 LPC7M1233, unsuppor ed\n"/span>


 2536/a>                         a href="+code=dmuperiodexit class="sref">gmuperiodexit/a> < 
 253                rrrrrrrrreturn -aINODEV/a>;
 253                 
 253
 254                ra href="+code=bprdinfo class="sref">vprdinfo/a> "Found MSC4 LPC7M1292\n"/span>


 2541/a>                 a href="+code=dmiodata" class="sref">smiodata"/a> >styp=/a> = smsc47m12/a>;
 254                 break
 2543/a>         default: 254                 a href="+code=dmuperiodexit class="sref">gmuperiodexit/a> < 
 254        r        eturn -aINODEV/a>;
 256        i
 254
 254         a href="+code=dmuperiodselect class="sref">gmuperiodselect/a> < 
 2549/a>        sa href="+code=dtdd" class="sref">atdd"/a>;= <asuperiodinb/a> aSUPERIOREG"_BASE/a>); 255               |  a href="+code=dmuperiodinb class="sref">asuperiodinb/a> aSUPERIOREG"_BASE/a>) + < 
 2551/a>         n (atdd"/a>;= = 0;<
 255                 a href="+code=bprdinfo class="sref">vprdinfo/a> "Dvice_itdd"ess notcse" 


 255                 a href="+code=Smuperiodexit class="sref">gmuperiodexit/a> < 
 255                 eturn -aINODEV/a>;
 2555/a>        s
 255
 255        sapan class="comment">/* /span>
 255
apan class="comment">/       < * Enable only n (tdd"ess is set (needed at least on the/span>
 255 apan class="comment">/       < * Comptq P"esario S4000NX)/span>
 256 apan class="comment">/       < *
 2561/a>         a href="+code=dmiodata" class="sref">smiodata"/a> >dtctivae"/a> = asuperiodinb/a> aSUPERIOREG"_ACT/a> 

 2562/a>         n (<smiodata"/a> >dtctivae"/a> =amp;< 0x01)= = 0;<
 256                 a href="+code=Sprdinfo class="sref">vprdinfo/a> "Enabling evice_\n"/span>


 256                 a href="+code=dmuperiodoutb class="sref">asuperiodoutb/a> aSUPERIOREG"_ACT/a>  smiodata"/a> >dtctivae"/a> =| 0x01)
 2565/a>        s
 256
 256        sa href="+code=dmuperiodexit class="sref">gmuperiodexit/a> < 
 256         eturn atdd"/a>;
 256

 2570/a>  257 apan class="comment">//* Restnre evice_ito its initial tatie *
 2572/a>static smsc47m1_drestnre/a> smsc47m1_dsiodata"/a> *smiodata"/a> 
 257{
 2574/a>         n (<smiodata"/a> >dtctivae"/a> =amp;< 0x01)= = 0;<
 257        r        a href="+code=dmuperiodente" class="sref">asuperiodente"/a> < 
 2576/a>                 a href="+code=bmuperiodselect class="sref">gmuperiodselect/a> < 
 257
 257                 a href="+code=bprdinfo class="sref">vprdinfo/a> "Disabling evice_\n"/span>


 257                 a href="+code=Smuperiodoutb class="sref">asuperiodoutb/a> aSUPERIOREG"_ACT/a>  smiodata"/a> >dtctivae"/a> 

 2580/a>  2581/a>                 a href="+code=dmuperiodexit class="sref">gmuperiodexit/a> < 
datm5n/> 192      ="L19d=5L276"582/a>        s
 158{
 1584/a>s 1585/a> #defne" a href="+code=dCHECK class="sref">gCHECK/a>            1 158 #defne" a href="+code=dREQUEST class="sref">aREQUEST/a>          2 158
 158
apan class="comment">/* /span>
 158 apan class="comment">/ * This function cn cbecusedito:/span>
 159 apan class="comment">/ *  - test for etsourceclonflicts with ACPI/span>
 159 apan class="comment">/ *  - request the etsources/span>
datm52" class="line" name="L152"> 159 apan class="comment">/ * Weconly allocate the I/O por s we etally need,ito minimize the risk of/span>
 159 apan class="comment">/ *clonflicts with ACPI or with other rivers/./span>
 159 apan class="comment">/ *
 159{tatic g__init/a> smsc47m1_dhandle_etsources/a> atdd"ess/a>   1596/a>                                             enumachips/a> styp=/a> ,dtction/a>   159                rrrrrrrrrrrrrrrrrrrrrrrrrrrrrtruct device *dev,
 159

 1599/a>        static su8/a> spor s_1_ref"<)= <
;
/ *
 2581/a>           0x04, 1on/a>   255           0xPC7M4on/a>   256           0x56, 7on/a>   2574/a>   9
}
 245{su8/a>  252            c#4id=8* Weconly allocate the I/Ote thfunleng ornt">/ *
 257           0x04, 1on/a>   257           0x09, 1on/a>     2581/a>           0x357M4on/a>   255           0x56, 7on/a>   256           0x697M4on/a>   2574/a>   9
}
 245{ 251   /a> ,    ;
 251    tic su *atdd"/a>;
 149
 251        stwitch sty)= = 0;<
 252        t/a> sms> 25efault: 2521/a>         default: 252                 a href="+code=c47m12 class="scode=>atde"/a> = spor s_d"/a>;
 252                 a href="+code=gs mic47m12 class="scode=gs miG"_Ae"/a> = spor s_t/a> < 
 252                 break
 2525/a>        t/a> smsc47mefault: 2526/a>                 a href="+code=c47m12 class="scode=>atde"/a> =  252                ra href="+code=gs mic47m12 class="scode=gs miG"_Ae"/a> =  252                 break
 2529/a>   8{
 2580/a>  2531/a>    testb/a> )      ra href="+code=gs mic47m12 class="scode=gs miG"_A; , 253           s/a>  = atdd"eSE/      a href="+code=c47m12 class="scode=>atd[, 252           s/a> atde"/a> = atd[, 1584/a>s 253        r       stwitch dtcti)= = 0;<
 2536/a>                t/a> gCHEefault: 253                rrr c#4id=8* Weconly allocatO* We * Wec tes">/ *clonfnt">/ *
 253                        ra href="+erodente" class="sero>atde"/a> =    atdCT/a>   257                         n ( 254                                 eturn ;
 2541/a>                         break
 254                t/a> aREQUEefault: 252                     apan class="comment">  - request the etsfnt">/ *
 254                       !/a> * deCT/a>    atdCT/a>   254        r                   /a> deC= 0;<
 1596/a>                                   o/a> R thfun0x%hx-0x%hx al   dy incn c!evice_\n"/C= 0;<
 159                rrrrrrrrrrrrrrrrrrr/a>    atdt/a> < 
 253                                 eturn -atdd"/a>;
 257                   8{
 255                         break
 2541/a>           8{
        s
 149{ 255         e0 break
 25     s
 255
 2572/a>static smsc47move_filtsodoutrrrrrrtruct device *dev,
 159

 1499/a>        sa href="+cysfsc47move_47m1_dgrou" class="srysfsc47move_47m1_odout     iamp;dea"/a> >smsc47m1_dgrou" class="sref">Smsc47m1_dgrot/a> < 
 250        dea"/a> >smsc47m1__fansmsc47m1__fan < 
 2561/a>         a href="+cysfsc47move_47m1_dgrou" class="srysfsc47move_47m1_odout     iamp;dea"/a> >smsc47m1__fanu"fpwm2 class="sref">smsc47m1_dfanudgrot/a> < 
 2562/a>         a href="+cysfsc47move_47m1_dgrou" class="srysfsc47move_47m1_odout     iamp;dea"/a> >smsc47m1__fanu"fpwm3 class="sref">Smsc47m1_dfanudgrot/a> < 
 256         a href="+cysfsc47move_47m1_dgrou" class="srysfsc47move_47m1_odout     iamp;dea"/a> >smsc47m1__pwssources class="sref">smsc47m1__pwssdgrot/a> < 
 256         a href="+cysfsc47move_47m1_dgrou" class="srysfsc47move_47m1_odout     iamp;dea"/a> >smsc47m1__pwsu"fpwm2 class="sref">smsc47m1_dgrou"fpwt/a> < 
 2565/a>         a href="+cysfsc47move_47m1_dgrou" class="srysfsc47move_47m1_odout     iamp;dea"/a> >smsc47m1__pwsu"fpwm3 class="sref">Smsc47m1_dgrou"fpwt/a> < 
 25     s
 158
 259{tatic g__init/a> dev,
 259

 250   rrrrrrtruct device *de =T     iamp;dea"/a> >de/a> < 
smsc47m1_dsiodata"/a> *smiodate"/a> = dea"/a> >de/a> < 
smsc_dsiodata"/a> *de/a> < 
 *atdd"/a>;
 2574/a>    tic ;
 257    tic     ;
 255
/c atd[_ref"<)= <
 257            /a> wmon/smsice_\n"/C= 0;<
 257            /a> wmon/sm2ice_\n"/C= 0;<
 250   9
}
 250
 2562/a>         a href="+rtsources class="sre=>atde"/a> = deCT/a>  deCT0t/a> < 
 256         a href="+erodente" class="sero>atde"/a> = smsc47m1_dhandle_etsource      a href="+rtsources class="sre=>atda"/a> >  smiodata"/a> >styC= 0;<
 254                   7            /a> aREQUECT/a>  dev/a> < 
 257         n ( 1596/a>                 eturn ;
 158
 254         a href="+_dsiodata" class="scami">dee"/a> =  deCTs mioftrrrrrrtruct smsc_dsiodat)CT/a>  dev/a> < 
dev,
 255                 eturn -atdd"/a>;
 250
 2562/a>         a href="+cdsiodata" class="scami">dea"/a> >atdd"/      a href="+rtsources class="sre=>atda"/a> >;
 256         a href="+cdsiodata" class="scami">dea"/a> >styp=/a> = smiodata"/a> >styd"/a>;
 256         a href="+cdsiodata" class="scami">dea"/a> >styp=/a> = atd[a> = smiodata"/a> >sty] break
 2565/a>         a href="+mutexode=b__init class="smutexode=bodout     iamp;dea"/a> >dev/a> < 
 1596/a>   a> = deCT/a>  dev/a> < 
 158
 254    
apan class="comment">/* /span>
 255 apan class="comment">/     If no* This funis proper We  pi clolly nhere'tdd" po ticint">/* /span>
 256 apan class="comment">/     actu we ee the I/Disaquesref"ivers/./span>
 159 apan class="comment">/    t">/ *
 2562/a>         a href="+cwssources class="spwssdgrod"/a>;= <smsc47ad_valudevice" class="scode=gssc47ad_valudodoutb/a> deCT/a>   256          0x01x04/a> < 
 256         a href="+cwssc47m12 class="scrou"fpwd"/a>;= <smsc47ad_valudevice" class="scode=gssc47ad_valudodoutb/a> deCT/a>   254        r 0x01x04/a> < 
dea"/a> >styp==/a> = smsc47m)= = 0;<
 252            ;= <smsc47ad_valudevice" class="scode=gssc47ad_valudodoutb/a> deCT/a>  dev,
 257                   /a>); < 
 257           /a>  ;= <smsc47ad_valudevice" class="scode=gssc47ad_valudodoutb/a> deCT/a>  dev,
); < 
 2581/a>           /a>  ;= <smsc47ad_valudevice" class="scode=gssc47ad_valudodoutb/a> deCT/a>  dev,
 255                   /a>); < 
 256           /a>  ;= <smsc47ad_valudevice" class="scode=gssc47ad_valudodoutb/a> deCT/a>  dev,
 254                   /a>); < 
 2565/a>     else= = 0;<
 2526/a>                 a href="+fan;= <smsc47ad_valudevice" class="scode=gssc47ad_valudodoutb/a> deCT/a>   159                rrr/a>); < 
 257                 a href="+fanu"fpwm2 class="sfanudgrod"/a>;= <smsc47ad_valudevice" class="scode=gssc47ad_valudodoutb/a> deCT/a>   257                   /a>); < 
 254                ra href="+fanu"fpwm3 class="sfanudgrod"/0 break
 2581/a>           /a>          s
 252       !tb/a>  252           b/a>  deCTo/a> "D


 254        r        eturn -aINODEV/a>;
 2526/a>        s
 158
 254    
apan class="comment">/* /span>
 255 apan class="comment">/     Some valuds (faned,i, apock divid"dr, groee the I/s) may b on the/span>
 256 apan class="comment">/      set (nbef* Reany upcamenis ss=ggeolly so porbet I/r s daquemon the/span>
 159 apan class="comment">/    needed at let;Dhere.t">/don'ill u we edice_aqueedway, buicint">/* /span>
 159 apan class="comment">/    nt>/ *particular     , manu we ee adDisa5ee the I/s ouicof 8t">/* /span>
 159 apan class="comment">/    ndoesn'ilmake much sensReand po'rorbet I/rusDisaquesexhe Dist">/* /span>
 159 apan class="comment">/    n This fuivers/./span>
 259 apan class="comment">/    t">/ *
 1596/a>   a> = deCT=| 0x01)
 158
 254    
apan class="commen R the I/ rysfs hooksfnt">/ *
 254           b/a>  = dea"/a> > 2541/a>                                         iamp;smsc47m1__fansmsc47m1__fan < 
 254                 n ( 252                   goto b/a> ;
 254     elseV/a>;
 254        r  b/a>  deCTo/a> F> <1  255
 159       b/a>  253           b/a>  = dea"/a> > 257                                         iamp;smsc47m1__fanu"fpwm2 class="sref">smsc47m1_dfanudgrot/a> < 
 255                 n ( 2541/a>                   goto b/a> ;
     elseV/a>;
 256           /a>   deCTo/a> F> <2  1584/a>s 257         n ( 2526/a>                 a href="+erodente" class="sero>atde"/a> = dea"/a> > 159                rrrrrrrrrrrrrrrrrrrr     iamp;smsc47m1__fanu"fpwm3 class="sref">Smsc47m1_dfanudgrot/a> < 
 253                 n ( 257                   goto b/a> ;
 250     else=      n (dea"/a> >styp==/a> = smsc47m)V/a>;
 2581/a>           /a>   deCTo/a> F> <3  25an>


 252             a href="+cwssources class="spwssdgro)= = 0;<
 252           b/a>  = dea"/a> > 254        r       rrrrrrrrrrrrrrrrrrrr     iamp;smsc47m1__pwssources class="sref">smsc47m1__pwssdgrot/a> < 
 2526/a>                 n ( 159                rrrgoto b/a> ;
 257           /a>   deCTo/a> PWM<1  2580/a>  254           b/a>  = dea"/a> > 252                   rrrrrrrrrrrrrrrrr     iamp;smsc47m1__pwsu"fpwm2 class="sref">smsc47m1_dgrou"fpwt/a> < 
 252                 n ( 254        r       rrrgoto b/a> ;
 252             deCTo/a> PWM<2  149
 254           b/a>  = dea"/a> > 2541/a>                                         iamp;smsc47m1__pwsu"fpwm3 class="sref">Smsc47m1_dgrou"fpwt/a> < 
 254                 n ( 252                   goto b/a> ;
 254     else=      n (dea"/a> >styp==/a> = smsc47m)V/a>;
 254        r  b/a>  deCTo/a> PWM<3  255
 252   b/a>  = dea"/a> >smsc47m1_dgrou" class="sref">Smsc47m1_dgrot/a> < 
 254         n ( 257           goto b/a> ;
 2580/a>  2561/a>         a href="+cdsiodata" class="scami">dea"/a> > = det/a> < 
 2562/a>         n (dea"/a> > 256           /a>   = dea"/a> > 252           goto b/a> ;
 2565/a>        s
 255
 252         e0 break
 149
 255/a>  250        smsc47move_filtsodoutb/a> det/a> < 
 25     s
 149{ 259{tatic  252     smsc47moveodoutrrrrrrtruct dev,
 25 = 0;<
smsc_dsiodata"/a> *dee"/a> = det/a> < 
 158
 254         a href="+vers/_codice_une the I/e=dev" class="svers/_codice_une the I/odoutb/a> dea"/a> > 1499/a>        sa href="+code=gssc47move_filtsources class="sref">smsc47move_filtsodout     iamp;dea"/a> >det/a> < 
 2580/a>  25     s
 149{ 259{trrrrrrtruct smsc_dsiodata"/a> *device *deC= 0;<
 254        r  atic ,
 25 = 0;<
smsc_dsiodata"/a> *dee"/a> = det/a> < 
 149
 1499/a>        sa href="+mutexonlykodata" class="smutexonlykodout     iamp;dea"/a> >dev/a> < 
 2580/a> deCToamp;dea"/a> > 250+Toamp; 254            tic deCToamp; 256           /a>   = dea"/a> >styp==/a> = smsc47m ? 3 : 2/a> < 
 1584/a>s 254        r  for        a href="+d__init class="sd">ded"/0 c deE/a>) oamp;de++v= = 0;<
 2526/a>                   /a>  dea"/a> >de[a> = de]e"/a> = deC= 0;<
 159                rrrrrrrrrrrrrrrrrrb/a> de[a> = de]v/a> < 
 257                   /a>  dea"/a> >de[a> = de]e"/a> = deC= 0;<
 257                                    rrrrrrb/a> de[a> = de]v/a> < 
  dea"/a> >de[a> = de]e"/a> = deC= 0;<
 2541/a>                                  b/a> de[a> = de]v/a> < 
 254                s
 149{ 252           b/a> ded"/a> = deCrb/a> dev/a> < 
 254        r  b/a> dea"/a> >de[0]d"/a>;= <deE//a>//a> 4EV/a>); < 
 2526/a>                 a href="+cdsiodata" class="scami">dea"/a> >de[1]e"/a> = deE//a>//a> 6/a> < 
 158
 253           b/a> dea"/a> >ded"/a> = deC8
 257                          b/a> //a> 6/a> < 
 254           b
apan class="commen Clear clarms     set (nnt">/ *
 2541/a>                 n (dea"/a> >dev,
 254                   b/a> deCrb/a>  < 
 149{ 252                 n (= 3v= = 0;<
 254        r          b/a> dea"/a> >de[2]d"/a>;= <deC8
 2526/a>                                       b/a>  159                rrrb/a> dea"/a> >ded|"/a>;= <deC8
 253                                    b/a>  257                   b
apan class="commen Clear clarm     set (nnt">/ *
 255                         n (dea"/a> >deV/a>);,
 2541/a>                           b/a> deC,
 254                                                b/a>  256                                                am40v/a> < 
 252                s
 25    s
 2526/a>                 a href="+cdsiodata" class="scami">dea"/a> > 250"/a> = de/a> < 
 159        s
 149
 1499/a>        sa href="+mutexounnlykodata" class="smutexounnlykodout     iamp;dea"/a> >dev/a> < 
 250         e/a>  de/a> < 
 25     s
 25an>


 259{tatic  252                                 const rrrrrrtruct  * 25 = 0;<
ded"/ = 0;<
 159           ./a> * 159<"/a> = ,
 253           ./a> * =  257           ./a> * 257 =  255           ./a> * 159<"/a> = ,
 254   atic  149{ 256         a href="+erodente" class="sero>atde"/a> = smschandle_e sour=dsodoutb/a>  =  >styC/a> = styC/a> = dev/a> < 
 257         n ( 2526/a>           goto b/a>  25/a> < 
 158
 254         a href="+pcode=dev" class="spref">dee"/a> = dev= = 0;<
 254           b/a>  25/a> < 
 2541/a>                 a href="+pr_erodente" class="spr_eroodoutb/a> "Dalnlyas fu failedotcuse\n"/span>


 254           goto b/a>  25/a> < 
 252        s
 1584/a>s 254         a href="+erodente" class="sero>atde"/a> =  deCT     iamp;deCT=| 0x01)
 252            "De sour=d addis fu failed (%d)otcuse\n"/C/a> =  253           goto b/a>  25/a> < 
 257        s
 2580/a>  2561/a>         a href="+erodente" class="sero>atde"/a> = deCTa> = datm52" class="line" na8e="L189"> 254                                  sizeoftrrrrrrtruct  256         n ( 252            Platform =dmiDalnlyas fu failedotcuse\n"/span>


 254        r  goto b/a>  25/a> < 
 2526/a>        s
 158
 254         a href="+erodente" class="sero>atde"/a> = despan>


;
 254           b/a> "Daddis fu failed (%d)otcuse\n"/C/a> =  2541/a>           goto b/a>  25/a> < 
 149{ 252         e0 break
 25    s
 252   b/a>  despan>


 25b/a>  25efault: 1499/a>         e/a>   25     s
 259{tatic ,
 14 = 0;<
 252   atic  254   unsign (nshoric  < 
 158
 254         a href="+erodente" class="sero>atde"/a> =  254                 e/a>   2561/a>         a href="+addressources class="scddressodou0"/a> =  25an>


 256   b
apan class="commen Sets global pref as a side efferrtnt">/ *
 256         a href="+erodente" class="sero>atde"/a> =  257         n ( 2526/a>                 e/a>   158
 254         a href="+erodente" class="sero>atde"/a> = deCTa> =  25v/a> < 
 atd/a> < 
 254         e0 break
 149{ 25b/a> atdefault: 254         a href="+platform__odice_une the I/e=dev" class="splatform__odice_une the I/odoutb/a> despan>


 2526/a>   a> =  252         e/a>   25     s
 25    s
 259{tvoidc  252     ,
 25 = 0;<
 254   a> = dev/a> < 
dea"/a> >de./a> * 256         a href="+platform__odice_une the I/e=dev" class="splatform__odice_une the I/odoutb/a> despan>


 25     s
 255
 15b/a> Mark D. StudebakerE/a>)mdsxyz123@yahoo.ass//a>/use\n"/span>


 25b/a> Foun LPn5x/1xx f>  255/a> GPL/use\n"/span>


 2580/a>  255/a>  


 255/a>  


 25


The original LXR softwar nby the n> LXR ass=ue=by">deCTthis experi="coal ="dr fu by n> lx/@assux.no">de.
lx/.assux.no kindly hoe Id by n> Redpill Lsspro AS">deCTproviderEof Lssux consult="c and operas fus