0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0018
0019 #include <linux/module.h>
0020 #include <linux/init.h>
0021 #include <linux/slab.h>
0022 #include <linux/jiffies.h>
0023 #include <linux/platform_device.h>
0024 #include <linux/hwmon.h>
0025 #include <linux/hwmon-sysfs.h>
0026 #include <linux/err.h>
0027 #include <linux/mutex.h>
0028 #include <linux/sysfs.h>
0029 #include <linux/ioport.h>
0030 #include <linux/acpi.h>
0031 #include <linux/io.h>
0032
0033 static unsigned short force_id;
0034 module_param(force_id, ushort, 0);
0035 MODULE_PARM_DESC(force_id, "Override the detected device ID");
0036
0037 static struct platform_device *pdev;
0038
0039 #define DRVNAME "pc87427"
0040
0041
0042
0043
0044
0045
0046 struct pc87427_data {
0047 struct device *hwmon_dev;
0048 struct mutex lock;
0049 int address[2];
0050 const char *name;
0051
0052 unsigned long last_updated;
0053 u8 fan_enabled;
0054 u16 fan[8];
0055 u16 fan_min[8];
0056 u8 fan_status[8];
0057
0058 u8 pwm_enabled;
0059 u8 pwm_auto_ok;
0060 u8 pwm_enable[4];
0061 u8 pwm[4];
0062
0063 u8 temp_enabled;
0064 s16 temp[6];
0065 s8 temp_min[6];
0066 s8 temp_max[6];
0067 s8 temp_crit[6];
0068 u8 temp_status[6];
0069 u8 temp_type[6];
0070 };
0071
0072 struct pc87427_sio_data {
0073 unsigned short address[2];
0074 u8 has_fanin;
0075 u8 has_fanout;
0076 };
0077
0078
0079
0080
0081
0082 #define SIOREG_LDSEL 0x07
0083 #define SIOREG_DEVID 0x20
0084 #define SIOREG_CF2 0x22
0085 #define SIOREG_CF3 0x23
0086 #define SIOREG_CF4 0x24
0087 #define SIOREG_CF5 0x25
0088 #define SIOREG_CFB 0x2B
0089 #define SIOREG_CFC 0x2C
0090 #define SIOREG_CFD 0x2D
0091 #define SIOREG_ACT 0x30
0092 #define SIOREG_MAP 0x50
0093 #define SIOREG_IOBASE 0x60
0094
0095 static const u8 logdev[2] = { 0x09, 0x14 };
0096 static const char *logdev_str[2] = { DRVNAME " FMC", DRVNAME " HMC" };
0097 #define LD_FAN 0
0098 #define LD_IN 1
0099 #define LD_TEMP 1
0100
0101 static inline int superio_enter(int sioaddr)
0102 {
0103 if (!request_muxed_region(sioaddr, 2, DRVNAME))
0104 return -EBUSY;
0105 return 0;
0106 }
0107
0108 static inline void superio_outb(int sioaddr, int reg, int val)
0109 {
0110 outb(reg, sioaddr);
0111 outb(val, sioaddr + 1);
0112 }
0113
0114 static inline int superio_inb(int sioaddr, int reg)
0115 {
0116 outb(reg, sioaddr);
0117 return inb(sioaddr + 1);
0118 }
0119
0120 static inline void superio_exit(int sioaddr)
0121 {
0122 outb(0x02, sioaddr);
0123 outb(0x02, sioaddr + 1);
0124 release_region(sioaddr, 2);
0125 }
0126
0127
0128
0129
0130
0131 #define REGION_LENGTH 32
0132 #define PC87427_REG_BANK 0x0f
0133 #define BANK_FM(nr) (nr)
0134 #define BANK_FT(nr) (0x08 + (nr))
0135 #define BANK_FC(nr) (0x10 + (nr) * 2)
0136 #define BANK_TM(nr) (nr)
0137 #define BANK_VM(nr) (0x08 + (nr))
0138
0139
0140
0141
0142
0143
0144 static inline int pc87427_read8(struct pc87427_data *data, u8 ldi, u8 reg)
0145 {
0146 return inb(data->address[ldi] + reg);
0147 }
0148
0149
0150 static inline int pc87427_read8_bank(struct pc87427_data *data, u8 ldi,
0151 u8 bank, u8 reg)
0152 {
0153 outb(bank, data->address[ldi] + PC87427_REG_BANK);
0154 return inb(data->address[ldi] + reg);
0155 }
0156
0157
0158 static inline void pc87427_write8_bank(struct pc87427_data *data, u8 ldi,
0159 u8 bank, u8 reg, u8 value)
0160 {
0161 outb(bank, data->address[ldi] + PC87427_REG_BANK);
0162 outb(value, data->address[ldi] + reg);
0163 }
0164
0165
0166
0167
0168
0169
0170 #define PC87427_REG_FAN 0x12
0171 #define PC87427_REG_FAN_MIN 0x14
0172 #define PC87427_REG_FAN_STATUS 0x10
0173
0174 #define FAN_STATUS_STALL (1 << 3)
0175 #define FAN_STATUS_LOSPD (1 << 1)
0176 #define FAN_STATUS_MONEN (1 << 0)
0177
0178
0179
0180
0181
0182
0183
0184 static void pc87427_readall_fan(struct pc87427_data *data, u8 nr)
0185 {
0186 int iobase = data->address[LD_FAN];
0187
0188 outb(BANK_FM(nr), iobase + PC87427_REG_BANK);
0189 data->fan[nr] = inw(iobase + PC87427_REG_FAN);
0190 data->fan_min[nr] = inw(iobase + PC87427_REG_FAN_MIN);
0191 data->fan_status[nr] = inb(iobase + PC87427_REG_FAN_STATUS);
0192
0193 outb(data->fan_status[nr], iobase + PC87427_REG_FAN_STATUS);
0194 }
0195
0196
0197
0198
0199
0200 static inline unsigned long fan_from_reg(u16 reg)
0201 {
0202 reg &= 0xfffc;
0203 if (reg == 0x0000 || reg == 0xfffc)
0204 return 0;
0205 return 5400000UL / reg;
0206 }
0207
0208
0209 static inline u16 fan_to_reg(unsigned long val)
0210 {
0211 if (val < 83UL)
0212 return 0xffff;
0213 if (val >= 1350000UL)
0214 return 0x0004;
0215 return ((1350000UL + val / 2) / val) << 2;
0216 }
0217
0218
0219
0220
0221
0222 #define PC87427_REG_PWM_ENABLE 0x10
0223 #define PC87427_REG_PWM_DUTY 0x12
0224
0225 #define PWM_ENABLE_MODE_MASK (7 << 4)
0226 #define PWM_ENABLE_CTLEN (1 << 0)
0227
0228 #define PWM_MODE_MANUAL (0 << 4)
0229 #define PWM_MODE_AUTO (1 << 4)
0230 #define PWM_MODE_OFF (2 << 4)
0231 #define PWM_MODE_ON (7 << 4)
0232
0233
0234
0235
0236
0237
0238
0239 static void pc87427_readall_pwm(struct pc87427_data *data, u8 nr)
0240 {
0241 int iobase = data->address[LD_FAN];
0242
0243 outb(BANK_FC(nr), iobase + PC87427_REG_BANK);
0244 data->pwm_enable[nr] = inb(iobase + PC87427_REG_PWM_ENABLE);
0245 data->pwm[nr] = inb(iobase + PC87427_REG_PWM_DUTY);
0246 }
0247
0248 static inline int pwm_enable_from_reg(u8 reg)
0249 {
0250 switch (reg & PWM_ENABLE_MODE_MASK) {
0251 case PWM_MODE_ON:
0252 return 0;
0253 case PWM_MODE_MANUAL:
0254 case PWM_MODE_OFF:
0255 return 1;
0256 case PWM_MODE_AUTO:
0257 return 2;
0258 default:
0259 return -EPROTO;
0260 }
0261 }
0262
0263 static inline u8 pwm_enable_to_reg(unsigned long val, u8 pwmval)
0264 {
0265 switch (val) {
0266 default:
0267 return PWM_MODE_ON;
0268 case 1:
0269 return pwmval ? PWM_MODE_MANUAL : PWM_MODE_OFF;
0270 case 2:
0271 return PWM_MODE_AUTO;
0272 }
0273 }
0274
0275
0276
0277
0278
0279 #define PC87427_REG_TEMP_STATUS 0x10
0280 #define PC87427_REG_TEMP 0x14
0281 #define PC87427_REG_TEMP_MAX 0x18
0282 #define PC87427_REG_TEMP_MIN 0x19
0283 #define PC87427_REG_TEMP_CRIT 0x1a
0284 #define PC87427_REG_TEMP_TYPE 0x1d
0285
0286 #define TEMP_STATUS_CHANEN (1 << 0)
0287 #define TEMP_STATUS_LOWFLG (1 << 1)
0288 #define TEMP_STATUS_HIGHFLG (1 << 2)
0289 #define TEMP_STATUS_CRITFLG (1 << 3)
0290 #define TEMP_STATUS_SENSERR (1 << 5)
0291 #define TEMP_TYPE_MASK (3 << 5)
0292
0293 #define TEMP_TYPE_THERMISTOR (1 << 5)
0294 #define TEMP_TYPE_REMOTE_DIODE (2 << 5)
0295 #define TEMP_TYPE_LOCAL_DIODE (3 << 5)
0296
0297
0298
0299
0300
0301
0302
0303 static void pc87427_readall_temp(struct pc87427_data *data, u8 nr)
0304 {
0305 int iobase = data->address[LD_TEMP];
0306
0307 outb(BANK_TM(nr), iobase + PC87427_REG_BANK);
0308 data->temp[nr] = le16_to_cpu(inw(iobase + PC87427_REG_TEMP));
0309 data->temp_max[nr] = inb(iobase + PC87427_REG_TEMP_MAX);
0310 data->temp_min[nr] = inb(iobase + PC87427_REG_TEMP_MIN);
0311 data->temp_crit[nr] = inb(iobase + PC87427_REG_TEMP_CRIT);
0312 data->temp_type[nr] = inb(iobase + PC87427_REG_TEMP_TYPE);
0313 data->temp_status[nr] = inb(iobase + PC87427_REG_TEMP_STATUS);
0314
0315 outb(data->temp_status[nr], iobase + PC87427_REG_TEMP_STATUS);
0316 }
0317
0318 static inline unsigned int temp_type_from_reg(u8 reg)
0319 {
0320 switch (reg & TEMP_TYPE_MASK) {
0321 case TEMP_TYPE_THERMISTOR:
0322 return 4;
0323 case TEMP_TYPE_REMOTE_DIODE:
0324 case TEMP_TYPE_LOCAL_DIODE:
0325 return 3;
0326 default:
0327 return 0;
0328 }
0329 }
0330
0331
0332
0333
0334
0335 static inline long temp_from_reg(s16 reg)
0336 {
0337 return reg * 1000 / 256;
0338 }
0339
0340 static inline long temp_from_reg8(s8 reg)
0341 {
0342 return reg * 1000;
0343 }
0344
0345
0346
0347
0348
0349 static struct pc87427_data *pc87427_update_device(struct device *dev)
0350 {
0351 struct pc87427_data *data = dev_get_drvdata(dev);
0352 int i;
0353
0354 mutex_lock(&data->lock);
0355 if (!time_after(jiffies, data->last_updated + HZ)
0356 && data->last_updated)
0357 goto done;
0358
0359
0360 for (i = 0; i < 8; i++) {
0361 if (!(data->fan_enabled & (1 << i)))
0362 continue;
0363 pc87427_readall_fan(data, i);
0364 }
0365
0366
0367 for (i = 0; i < 4; i++) {
0368 if (!(data->pwm_enabled & (1 << i)))
0369 continue;
0370 pc87427_readall_pwm(data, i);
0371 }
0372
0373
0374 for (i = 0; i < 6; i++) {
0375 if (!(data->temp_enabled & (1 << i)))
0376 continue;
0377 pc87427_readall_temp(data, i);
0378 }
0379
0380 data->last_updated = jiffies;
0381
0382 done:
0383 mutex_unlock(&data->lock);
0384 return data;
0385 }
0386
0387 static ssize_t fan_input_show(struct device *dev,
0388 struct device_attribute *devattr, char *buf)
0389 {
0390 struct pc87427_data *data = pc87427_update_device(dev);
0391 int nr = to_sensor_dev_attr(devattr)->index;
0392
0393 return sprintf(buf, "%lu\n", fan_from_reg(data->fan[nr]));
0394 }
0395
0396 static ssize_t fan_min_show(struct device *dev,
0397 struct device_attribute *devattr, char *buf)
0398 {
0399 struct pc87427_data *data = pc87427_update_device(dev);
0400 int nr = to_sensor_dev_attr(devattr)->index;
0401
0402 return sprintf(buf, "%lu\n", fan_from_reg(data->fan_min[nr]));
0403 }
0404
0405 static ssize_t fan_alarm_show(struct device *dev,
0406 struct device_attribute *devattr, char *buf)
0407 {
0408 struct pc87427_data *data = pc87427_update_device(dev);
0409 int nr = to_sensor_dev_attr(devattr)->index;
0410
0411 return sprintf(buf, "%d\n", !!(data->fan_status[nr]
0412 & FAN_STATUS_LOSPD));
0413 }
0414
0415 static ssize_t fan_fault_show(struct device *dev,
0416 struct device_attribute *devattr, char *buf)
0417 {
0418 struct pc87427_data *data = pc87427_update_device(dev);
0419 int nr = to_sensor_dev_attr(devattr)->index;
0420
0421 return sprintf(buf, "%d\n", !!(data->fan_status[nr]
0422 & FAN_STATUS_STALL));
0423 }
0424
0425 static ssize_t fan_min_store(struct device *dev,
0426 struct device_attribute *devattr,
0427 const char *buf, size_t count)
0428 {
0429 struct pc87427_data *data = dev_get_drvdata(dev);
0430 int nr = to_sensor_dev_attr(devattr)->index;
0431 unsigned long val;
0432 int iobase = data->address[LD_FAN];
0433
0434 if (kstrtoul(buf, 10, &val) < 0)
0435 return -EINVAL;
0436
0437 mutex_lock(&data->lock);
0438 outb(BANK_FM(nr), iobase + PC87427_REG_BANK);
0439
0440
0441
0442
0443
0444 outb(0, iobase + PC87427_REG_FAN_STATUS);
0445 data->fan_min[nr] = fan_to_reg(val);
0446 outw(data->fan_min[nr], iobase + PC87427_REG_FAN_MIN);
0447 outb(FAN_STATUS_MONEN, iobase + PC87427_REG_FAN_STATUS);
0448 mutex_unlock(&data->lock);
0449
0450 return count;
0451 }
0452
0453 static SENSOR_DEVICE_ATTR_RO(fan1_input, fan_input, 0);
0454 static SENSOR_DEVICE_ATTR_RO(fan2_input, fan_input, 1);
0455 static SENSOR_DEVICE_ATTR_RO(fan3_input, fan_input, 2);
0456 static SENSOR_DEVICE_ATTR_RO(fan4_input, fan_input, 3);
0457 static SENSOR_DEVICE_ATTR_RO(fan5_input, fan_input, 4);
0458 static SENSOR_DEVICE_ATTR_RO(fan6_input, fan_input, 5);
0459 static SENSOR_DEVICE_ATTR_RO(fan7_input, fan_input, 6);
0460 static SENSOR_DEVICE_ATTR_RO(fan8_input, fan_input, 7);
0461
0462 static SENSOR_DEVICE_ATTR_RW(fan1_min, fan_min, 0);
0463 static SENSOR_DEVICE_ATTR_RW(fan2_min, fan_min, 1);
0464 static SENSOR_DEVICE_ATTR_RW(fan3_min, fan_min, 2);
0465 static SENSOR_DEVICE_ATTR_RW(fan4_min, fan_min, 3);
0466 static SENSOR_DEVICE_ATTR_RW(fan5_min, fan_min, 4);
0467 static SENSOR_DEVICE_ATTR_RW(fan6_min, fan_min, 5);
0468 static SENSOR_DEVICE_ATTR_RW(fan7_min, fan_min, 6);
0469 static SENSOR_DEVICE_ATTR_RW(fan8_min, fan_min, 7);
0470
0471 static SENSOR_DEVICE_ATTR_RO(fan1_alarm, fan_alarm, 0);
0472 static SENSOR_DEVICE_ATTR_RO(fan2_alarm, fan_alarm, 1);
0473 static SENSOR_DEVICE_ATTR_RO(fan3_alarm, fan_alarm, 2);
0474 static SENSOR_DEVICE_ATTR_RO(fan4_alarm, fan_alarm, 3);
0475 static SENSOR_DEVICE_ATTR_RO(fan5_alarm, fan_alarm, 4);
0476 static SENSOR_DEVICE_ATTR_RO(fan6_alarm, fan_alarm, 5);
0477 static SENSOR_DEVICE_ATTR_RO(fan7_alarm, fan_alarm, 6);
0478 static SENSOR_DEVICE_ATTR_RO(fan8_alarm, fan_alarm, 7);
0479
0480 static SENSOR_DEVICE_ATTR_RO(fan1_fault, fan_fault, 0);
0481 static SENSOR_DEVICE_ATTR_RO(fan2_fault, fan_fault, 1);
0482 static SENSOR_DEVICE_ATTR_RO(fan3_fault, fan_fault, 2);
0483 static SENSOR_DEVICE_ATTR_RO(fan4_fault, fan_fault, 3);
0484 static SENSOR_DEVICE_ATTR_RO(fan5_fault, fan_fault, 4);
0485 static SENSOR_DEVICE_ATTR_RO(fan6_fault, fan_fault, 5);
0486 static SENSOR_DEVICE_ATTR_RO(fan7_fault, fan_fault, 6);
0487 static SENSOR_DEVICE_ATTR_RO(fan8_fault, fan_fault, 7);
0488
0489 static struct attribute *pc87427_attributes_fan[8][5] = {
0490 {
0491 &sensor_dev_attr_fan1_input.dev_attr.attr,
0492 &sensor_dev_attr_fan1_min.dev_attr.attr,
0493 &sensor_dev_attr_fan1_alarm.dev_attr.attr,
0494 &sensor_dev_attr_fan1_fault.dev_attr.attr,
0495 NULL
0496 }, {
0497 &sensor_dev_attr_fan2_input.dev_attr.attr,
0498 &sensor_dev_attr_fan2_min.dev_attr.attr,
0499 &sensor_dev_attr_fan2_alarm.dev_attr.attr,
0500 &sensor_dev_attr_fan2_fault.dev_attr.attr,
0501 NULL
0502 }, {
0503 &sensor_dev_attr_fan3_input.dev_attr.attr,
0504 &sensor_dev_attr_fan3_min.dev_attr.attr,
0505 &sensor_dev_attr_fan3_alarm.dev_attr.attr,
0506 &sensor_dev_attr_fan3_fault.dev_attr.attr,
0507 NULL
0508 }, {
0509 &sensor_dev_attr_fan4_input.dev_attr.attr,
0510 &sensor_dev_attr_fan4_min.dev_attr.attr,
0511 &sensor_dev_attr_fan4_alarm.dev_attr.attr,
0512 &sensor_dev_attr_fan4_fault.dev_attr.attr,
0513 NULL
0514 }, {
0515 &sensor_dev_attr_fan5_input.dev_attr.attr,
0516 &sensor_dev_attr_fan5_min.dev_attr.attr,
0517 &sensor_dev_attr_fan5_alarm.dev_attr.attr,
0518 &sensor_dev_attr_fan5_fault.dev_attr.attr,
0519 NULL
0520 }, {
0521 &sensor_dev_attr_fan6_input.dev_attr.attr,
0522 &sensor_dev_attr_fan6_min.dev_attr.attr,
0523 &sensor_dev_attr_fan6_alarm.dev_attr.attr,
0524 &sensor_dev_attr_fan6_fault.dev_attr.attr,
0525 NULL
0526 }, {
0527 &sensor_dev_attr_fan7_input.dev_attr.attr,
0528 &sensor_dev_attr_fan7_min.dev_attr.attr,
0529 &sensor_dev_attr_fan7_alarm.dev_attr.attr,
0530 &sensor_dev_attr_fan7_fault.dev_attr.attr,
0531 NULL
0532 }, {
0533 &sensor_dev_attr_fan8_input.dev_attr.attr,
0534 &sensor_dev_attr_fan8_min.dev_attr.attr,
0535 &sensor_dev_attr_fan8_alarm.dev_attr.attr,
0536 &sensor_dev_attr_fan8_fault.dev_attr.attr,
0537 NULL
0538 }
0539 };
0540
0541 static const struct attribute_group pc87427_group_fan[8] = {
0542 { .attrs = pc87427_attributes_fan[0] },
0543 { .attrs = pc87427_attributes_fan[1] },
0544 { .attrs = pc87427_attributes_fan[2] },
0545 { .attrs = pc87427_attributes_fan[3] },
0546 { .attrs = pc87427_attributes_fan[4] },
0547 { .attrs = pc87427_attributes_fan[5] },
0548 { .attrs = pc87427_attributes_fan[6] },
0549 { .attrs = pc87427_attributes_fan[7] },
0550 };
0551
0552
0553
0554
0555
0556 static void update_pwm_enable(struct pc87427_data *data, int nr, u8 mode)
0557 {
0558 int iobase = data->address[LD_FAN];
0559 data->pwm_enable[nr] &= ~PWM_ENABLE_MODE_MASK;
0560 data->pwm_enable[nr] |= mode;
0561 outb(data->pwm_enable[nr], iobase + PC87427_REG_PWM_ENABLE);
0562 }
0563
0564 static ssize_t pwm_enable_show(struct device *dev,
0565 struct device_attribute *devattr, char *buf)
0566 {
0567 struct pc87427_data *data = pc87427_update_device(dev);
0568 int nr = to_sensor_dev_attr(devattr)->index;
0569 int pwm_enable;
0570
0571 pwm_enable = pwm_enable_from_reg(data->pwm_enable[nr]);
0572 if (pwm_enable < 0)
0573 return pwm_enable;
0574 return sprintf(buf, "%d\n", pwm_enable);
0575 }
0576
0577 static ssize_t pwm_enable_store(struct device *dev,
0578 struct device_attribute *devattr,
0579 const char *buf, size_t count)
0580 {
0581 struct pc87427_data *data = dev_get_drvdata(dev);
0582 int nr = to_sensor_dev_attr(devattr)->index;
0583 unsigned long val;
0584
0585 if (kstrtoul(buf, 10, &val) < 0 || val > 2)
0586 return -EINVAL;
0587
0588 if (val == 2 && !(data->pwm_auto_ok & (1 << nr)))
0589 return -EINVAL;
0590
0591 mutex_lock(&data->lock);
0592 pc87427_readall_pwm(data, nr);
0593 update_pwm_enable(data, nr, pwm_enable_to_reg(val, data->pwm[nr]));
0594 mutex_unlock(&data->lock);
0595
0596 return count;
0597 }
0598
0599 static ssize_t pwm_show(struct device *dev, struct device_attribute *devattr,
0600 char *buf)
0601 {
0602 struct pc87427_data *data = pc87427_update_device(dev);
0603 int nr = to_sensor_dev_attr(devattr)->index;
0604
0605 return sprintf(buf, "%d\n", (int)data->pwm[nr]);
0606 }
0607
0608 static ssize_t pwm_store(struct device *dev, struct device_attribute *devattr,
0609 const char *buf, size_t count)
0610 {
0611 struct pc87427_data *data = dev_get_drvdata(dev);
0612 int nr = to_sensor_dev_attr(devattr)->index;
0613 unsigned long val;
0614 int iobase = data->address[LD_FAN];
0615 u8 mode;
0616
0617 if (kstrtoul(buf, 10, &val) < 0 || val > 0xff)
0618 return -EINVAL;
0619
0620 mutex_lock(&data->lock);
0621 pc87427_readall_pwm(data, nr);
0622 mode = data->pwm_enable[nr] & PWM_ENABLE_MODE_MASK;
0623 if (mode != PWM_MODE_MANUAL && mode != PWM_MODE_OFF) {
0624 dev_notice(dev,
0625 "Can't set PWM%d duty cycle while not in manual mode\n",
0626 nr + 1);
0627 mutex_unlock(&data->lock);
0628 return -EPERM;
0629 }
0630
0631
0632 if (mode == PWM_MODE_MANUAL && val == 0) {
0633
0634 update_pwm_enable(data, nr, PWM_MODE_OFF);
0635 mode = PWM_MODE_OFF;
0636 dev_dbg(dev, "Switching PWM%d from %s to %s\n", nr + 1,
0637 "manual", "off");
0638 } else if (mode == PWM_MODE_OFF && val != 0) {
0639
0640 update_pwm_enable(data, nr, PWM_MODE_MANUAL);
0641 mode = PWM_MODE_MANUAL;
0642 dev_dbg(dev, "Switching PWM%d from %s to %s\n", nr + 1,
0643 "off", "manual");
0644 }
0645
0646 data->pwm[nr] = val;
0647 if (mode == PWM_MODE_MANUAL)
0648 outb(val, iobase + PC87427_REG_PWM_DUTY);
0649 mutex_unlock(&data->lock);
0650
0651 return count;
0652 }
0653
0654 static SENSOR_DEVICE_ATTR_RW(pwm1_enable, pwm_enable, 0);
0655 static SENSOR_DEVICE_ATTR_RW(pwm2_enable, pwm_enable, 1);
0656 static SENSOR_DEVICE_ATTR_RW(pwm3_enable, pwm_enable, 2);
0657 static SENSOR_DEVICE_ATTR_RW(pwm4_enable, pwm_enable, 3);
0658
0659 static SENSOR_DEVICE_ATTR_RW(pwm1, pwm, 0);
0660 static SENSOR_DEVICE_ATTR_RW(pwm2, pwm, 1);
0661 static SENSOR_DEVICE_ATTR_RW(pwm3, pwm, 2);
0662 static SENSOR_DEVICE_ATTR_RW(pwm4, pwm, 3);
0663
0664 static struct attribute *pc87427_attributes_pwm[4][3] = {
0665 {
0666 &sensor_dev_attr_pwm1_enable.dev_attr.attr,
0667 &sensor_dev_attr_pwm1.dev_attr.attr,
0668 NULL
0669 }, {
0670 &sensor_dev_attr_pwm2_enable.dev_attr.attr,
0671 &sensor_dev_attr_pwm2.dev_attr.attr,
0672 NULL
0673 }, {
0674 &sensor_dev_attr_pwm3_enable.dev_attr.attr,
0675 &sensor_dev_attr_pwm3.dev_attr.attr,
0676 NULL
0677 }, {
0678 &sensor_dev_attr_pwm4_enable.dev_attr.attr,
0679 &sensor_dev_attr_pwm4.dev_attr.attr,
0680 NULL
0681 }
0682 };
0683
0684 static const struct attribute_group pc87427_group_pwm[4] = {
0685 { .attrs = pc87427_attributes_pwm[0] },
0686 { .attrs = pc87427_attributes_pwm[1] },
0687 { .attrs = pc87427_attributes_pwm[2] },
0688 { .attrs = pc87427_attributes_pwm[3] },
0689 };
0690
0691 static ssize_t temp_input_show(struct device *dev,
0692 struct device_attribute *devattr, char *buf)
0693 {
0694 struct pc87427_data *data = pc87427_update_device(dev);
0695 int nr = to_sensor_dev_attr(devattr)->index;
0696
0697 return sprintf(buf, "%ld\n", temp_from_reg(data->temp[nr]));
0698 }
0699
0700 static ssize_t temp_min_show(struct device *dev,
0701 struct device_attribute *devattr, char *buf)
0702 {
0703 struct pc87427_data *data = pc87427_update_device(dev);
0704 int nr = to_sensor_dev_attr(devattr)->index;
0705
0706 return sprintf(buf, "%ld\n", temp_from_reg8(data->temp_min[nr]));
0707 }
0708
0709 static ssize_t temp_max_show(struct device *dev,
0710 struct device_attribute *devattr, char *buf)
0711 {
0712 struct pc87427_data *data = pc87427_update_device(dev);
0713 int nr = to_sensor_dev_attr(devattr)->index;
0714
0715 return sprintf(buf, "%ld\n", temp_from_reg8(data->temp_max[nr]));
0716 }
0717
0718 static ssize_t temp_crit_show(struct device *dev,
0719 struct device_attribute *devattr, char *buf)
0720 {
0721 struct pc87427_data *data = pc87427_update_device(dev);
0722 int nr = to_sensor_dev_attr(devattr)->index;
0723
0724 return sprintf(buf, "%ld\n", temp_from_reg8(data->temp_crit[nr]));
0725 }
0726
0727 static ssize_t temp_type_show(struct device *dev,
0728 struct device_attribute *devattr, char *buf)
0729 {
0730 struct pc87427_data *data = pc87427_update_device(dev);
0731 int nr = to_sensor_dev_attr(devattr)->index;
0732
0733 return sprintf(buf, "%u\n", temp_type_from_reg(data->temp_type[nr]));
0734 }
0735
0736 static ssize_t temp_min_alarm_show(struct device *dev,
0737 struct device_attribute *devattr,
0738 char *buf)
0739 {
0740 struct pc87427_data *data = pc87427_update_device(dev);
0741 int nr = to_sensor_dev_attr(devattr)->index;
0742
0743 return sprintf(buf, "%d\n", !!(data->temp_status[nr]
0744 & TEMP_STATUS_LOWFLG));
0745 }
0746
0747 static ssize_t temp_max_alarm_show(struct device *dev,
0748 struct device_attribute *devattr,
0749 char *buf)
0750 {
0751 struct pc87427_data *data = pc87427_update_device(dev);
0752 int nr = to_sensor_dev_attr(devattr)->index;
0753
0754 return sprintf(buf, "%d\n", !!(data->temp_status[nr]
0755 & TEMP_STATUS_HIGHFLG));
0756 }
0757
0758 static ssize_t temp_crit_alarm_show(struct device *dev,
0759 struct device_attribute *devattr,
0760 char *buf)
0761 {
0762 struct pc87427_data *data = pc87427_update_device(dev);
0763 int nr = to_sensor_dev_attr(devattr)->index;
0764
0765 return sprintf(buf, "%d\n", !!(data->temp_status[nr]
0766 & TEMP_STATUS_CRITFLG));
0767 }
0768
0769 static ssize_t temp_fault_show(struct device *dev,
0770 struct device_attribute *devattr, char *buf)
0771 {
0772 struct pc87427_data *data = pc87427_update_device(dev);
0773 int nr = to_sensor_dev_attr(devattr)->index;
0774
0775 return sprintf(buf, "%d\n", !!(data->temp_status[nr]
0776 & TEMP_STATUS_SENSERR));
0777 }
0778
0779 static SENSOR_DEVICE_ATTR_RO(temp1_input, temp_input, 0);
0780 static SENSOR_DEVICE_ATTR_RO(temp2_input, temp_input, 1);
0781 static SENSOR_DEVICE_ATTR_RO(temp3_input, temp_input, 2);
0782 static SENSOR_DEVICE_ATTR_RO(temp4_input, temp_input, 3);
0783 static SENSOR_DEVICE_ATTR_RO(temp5_input, temp_input, 4);
0784 static SENSOR_DEVICE_ATTR_RO(temp6_input, temp_input, 5);
0785
0786 static SENSOR_DEVICE_ATTR_RO(temp1_min, temp_min, 0);
0787 static SENSOR_DEVICE_ATTR_RO(temp2_min, temp_min, 1);
0788 static SENSOR_DEVICE_ATTR_RO(temp3_min, temp_min, 2);
0789 static SENSOR_DEVICE_ATTR_RO(temp4_min, temp_min, 3);
0790 static SENSOR_DEVICE_ATTR_RO(temp5_min, temp_min, 4);
0791 static SENSOR_DEVICE_ATTR_RO(temp6_min, temp_min, 5);
0792
0793 static SENSOR_DEVICE_ATTR_RO(temp1_max, temp_max, 0);
0794 static SENSOR_DEVICE_ATTR_RO(temp2_max, temp_max, 1);
0795 static SENSOR_DEVICE_ATTR_RO(temp3_max, temp_max, 2);
0796 static SENSOR_DEVICE_ATTR_RO(temp4_max, temp_max, 3);
0797 static SENSOR_DEVICE_ATTR_RO(temp5_max, temp_max, 4);
0798 static SENSOR_DEVICE_ATTR_RO(temp6_max, temp_max, 5);
0799
0800 static SENSOR_DEVICE_ATTR_RO(temp1_crit, temp_crit, 0);
0801 static SENSOR_DEVICE_ATTR_RO(temp2_crit, temp_crit, 1);
0802 static SENSOR_DEVICE_ATTR_RO(temp3_crit, temp_crit, 2);
0803 static SENSOR_DEVICE_ATTR_RO(temp4_crit, temp_crit, 3);
0804 static SENSOR_DEVICE_ATTR_RO(temp5_crit, temp_crit, 4);
0805 static SENSOR_DEVICE_ATTR_RO(temp6_crit, temp_crit, 5);
0806
0807 static SENSOR_DEVICE_ATTR_RO(temp1_type, temp_type, 0);
0808 static SENSOR_DEVICE_ATTR_RO(temp2_type, temp_type, 1);
0809 static SENSOR_DEVICE_ATTR_RO(temp3_type, temp_type, 2);
0810 static SENSOR_DEVICE_ATTR_RO(temp4_type, temp_type, 3);
0811 static SENSOR_DEVICE_ATTR_RO(temp5_type, temp_type, 4);
0812 static SENSOR_DEVICE_ATTR_RO(temp6_type, temp_type, 5);
0813
0814 static SENSOR_DEVICE_ATTR_RO(temp1_min_alarm, temp_min_alarm, 0);
0815 static SENSOR_DEVICE_ATTR_RO(temp2_min_alarm, temp_min_alarm, 1);
0816 static SENSOR_DEVICE_ATTR_RO(temp3_min_alarm, temp_min_alarm, 2);
0817 static SENSOR_DEVICE_ATTR_RO(temp4_min_alarm, temp_min_alarm, 3);
0818 static SENSOR_DEVICE_ATTR_RO(temp5_min_alarm, temp_min_alarm, 4);
0819 static SENSOR_DEVICE_ATTR_RO(temp6_min_alarm, temp_min_alarm, 5);
0820
0821 static SENSOR_DEVICE_ATTR_RO(temp1_max_alarm, temp_max_alarm, 0);
0822 static SENSOR_DEVICE_ATTR_RO(temp2_max_alarm, temp_max_alarm, 1);
0823 static SENSOR_DEVICE_ATTR_RO(temp3_max_alarm, temp_max_alarm, 2);
0824 static SENSOR_DEVICE_ATTR_RO(temp4_max_alarm, temp_max_alarm, 3);
0825 static SENSOR_DEVICE_ATTR_RO(temp5_max_alarm, temp_max_alarm, 4);
0826 static SENSOR_DEVICE_ATTR_RO(temp6_max_alarm, temp_max_alarm, 5);
0827
0828 static SENSOR_DEVICE_ATTR_RO(temp1_crit_alarm, temp_crit_alarm, 0);
0829 static SENSOR_DEVICE_ATTR_RO(temp2_crit_alarm, temp_crit_alarm, 1);
0830 static SENSOR_DEVICE_ATTR_RO(temp3_crit_alarm, temp_crit_alarm, 2);
0831 static SENSOR_DEVICE_ATTR_RO(temp4_crit_alarm, temp_crit_alarm, 3);
0832 static SENSOR_DEVICE_ATTR_RO(temp5_crit_alarm, temp_crit_alarm, 4);
0833 static SENSOR_DEVICE_ATTR_RO(temp6_crit_alarm, temp_crit_alarm, 5);
0834
0835 static SENSOR_DEVICE_ATTR_RO(temp1_fault, temp_fault, 0);
0836 static SENSOR_DEVICE_ATTR_RO(temp2_fault, temp_fault, 1);
0837 static SENSOR_DEVICE_ATTR_RO(temp3_fault, temp_fault, 2);
0838 static SENSOR_DEVICE_ATTR_RO(temp4_fault, temp_fault, 3);
0839 static SENSOR_DEVICE_ATTR_RO(temp5_fault, temp_fault, 4);
0840 static SENSOR_DEVICE_ATTR_RO(temp6_fault, temp_fault, 5);
0841
0842 static struct attribute *pc87427_attributes_temp[6][10] = {
0843 {
0844 &sensor_dev_attr_temp1_input.dev_attr.attr,
0845 &sensor_dev_attr_temp1_min.dev_attr.attr,
0846 &sensor_dev_attr_temp1_max.dev_attr.attr,
0847 &sensor_dev_attr_temp1_crit.dev_attr.attr,
0848 &sensor_dev_attr_temp1_type.dev_attr.attr,
0849 &sensor_dev_attr_temp1_min_alarm.dev_attr.attr,
0850 &sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
0851 &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr,
0852 &sensor_dev_attr_temp1_fault.dev_attr.attr,
0853 NULL
0854 }, {
0855 &sensor_dev_attr_temp2_input.dev_attr.attr,
0856 &sensor_dev_attr_temp2_min.dev_attr.attr,
0857 &sensor_dev_attr_temp2_max.dev_attr.attr,
0858 &sensor_dev_attr_temp2_crit.dev_attr.attr,
0859 &sensor_dev_attr_temp2_type.dev_attr.attr,
0860 &sensor_dev_attr_temp2_min_alarm.dev_attr.attr,
0861 &sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
0862 &sensor_dev_attr_temp2_crit_alarm.dev_attr.attr,
0863 &sensor_dev_attr_temp2_fault.dev_attr.attr,
0864 NULL
0865 }, {
0866 &sensor_dev_attr_temp3_input.dev_attr.attr,
0867 &sensor_dev_attr_temp3_min.dev_attr.attr,
0868 &sensor_dev_attr_temp3_max.dev_attr.attr,
0869 &sensor_dev_attr_temp3_crit.dev_attr.attr,
0870 &sensor_dev_attr_temp3_type.dev_attr.attr,
0871 &sensor_dev_attr_temp3_min_alarm.dev_attr.attr,
0872 &sensor_dev_attr_temp3_max_alarm.dev_attr.attr,
0873 &sensor_dev_attr_temp3_crit_alarm.dev_attr.attr,
0874 &sensor_dev_attr_temp3_fault.dev_attr.attr,
0875 NULL
0876 }, {
0877 &sensor_dev_attr_temp4_input.dev_attr.attr,
0878 &sensor_dev_attr_temp4_min.dev_attr.attr,
0879 &sensor_dev_attr_temp4_max.dev_attr.attr,
0880 &sensor_dev_attr_temp4_crit.dev_attr.attr,
0881 &sensor_dev_attr_temp4_type.dev_attr.attr,
0882 &sensor_dev_attr_temp4_min_alarm.dev_attr.attr,
0883 &sensor_dev_attr_temp4_max_alarm.dev_attr.attr,
0884 &sensor_dev_attr_temp4_crit_alarm.dev_attr.attr,
0885 &sensor_dev_attr_temp4_fault.dev_attr.attr,
0886 NULL
0887 }, {
0888 &sensor_dev_attr_temp5_input.dev_attr.attr,
0889 &sensor_dev_attr_temp5_min.dev_attr.attr,
0890 &sensor_dev_attr_temp5_max.dev_attr.attr,
0891 &sensor_dev_attr_temp5_crit.dev_attr.attr,
0892 &sensor_dev_attr_temp5_type.dev_attr.attr,
0893 &sensor_dev_attr_temp5_min_alarm.dev_attr.attr,
0894 &sensor_dev_attr_temp5_max_alarm.dev_attr.attr,
0895 &sensor_dev_attr_temp5_crit_alarm.dev_attr.attr,
0896 &sensor_dev_attr_temp5_fault.dev_attr.attr,
0897 NULL
0898 }, {
0899 &sensor_dev_attr_temp6_input.dev_attr.attr,
0900 &sensor_dev_attr_temp6_min.dev_attr.attr,
0901 &sensor_dev_attr_temp6_max.dev_attr.attr,
0902 &sensor_dev_attr_temp6_crit.dev_attr.attr,
0903 &sensor_dev_attr_temp6_type.dev_attr.attr,
0904 &sensor_dev_attr_temp6_min_alarm.dev_attr.attr,
0905 &sensor_dev_attr_temp6_max_alarm.dev_attr.attr,
0906 &sensor_dev_attr_temp6_crit_alarm.dev_attr.attr,
0907 &sensor_dev_attr_temp6_fault.dev_attr.attr,
0908 NULL
0909 }
0910 };
0911
0912 static const struct attribute_group pc87427_group_temp[6] = {
0913 { .attrs = pc87427_attributes_temp[0] },
0914 { .attrs = pc87427_attributes_temp[1] },
0915 { .attrs = pc87427_attributes_temp[2] },
0916 { .attrs = pc87427_attributes_temp[3] },
0917 { .attrs = pc87427_attributes_temp[4] },
0918 { .attrs = pc87427_attributes_temp[5] },
0919 };
0920
0921 static ssize_t name_show(struct device *dev, struct device_attribute
0922 *devattr, char *buf)
0923 {
0924 struct pc87427_data *data = dev_get_drvdata(dev);
0925
0926 return sprintf(buf, "%s\n", data->name);
0927 }
0928 static DEVICE_ATTR_RO(name);
0929
0930
0931
0932
0933
0934
0935 static int pc87427_request_regions(struct platform_device *pdev,
0936 int count)
0937 {
0938 struct resource *res;
0939 int i;
0940
0941 for (i = 0; i < count; i++) {
0942 res = platform_get_resource(pdev, IORESOURCE_IO, i);
0943 if (!res) {
0944 dev_err(&pdev->dev, "Missing resource #%d\n", i);
0945 return -ENOENT;
0946 }
0947 if (!devm_request_region(&pdev->dev, res->start,
0948 resource_size(res), DRVNAME)) {
0949 dev_err(&pdev->dev,
0950 "Failed to request region 0x%lx-0x%lx\n",
0951 (unsigned long)res->start,
0952 (unsigned long)res->end);
0953 return -EBUSY;
0954 }
0955 }
0956 return 0;
0957 }
0958
0959 static void pc87427_init_device(struct device *dev)
0960 {
0961 struct pc87427_sio_data *sio_data = dev_get_platdata(dev);
0962 struct pc87427_data *data = dev_get_drvdata(dev);
0963 int i;
0964 u8 reg;
0965
0966
0967 reg = pc87427_read8(data, LD_FAN, PC87427_REG_BANK);
0968 if (!(reg & 0x80))
0969 dev_warn(dev, "%s module not ready!\n", "FMC");
0970
0971
0972 for (i = 0; i < 8; i++) {
0973 if (!(sio_data->has_fanin & (1 << i)))
0974 continue;
0975 reg = pc87427_read8_bank(data, LD_FAN, BANK_FM(i),
0976 PC87427_REG_FAN_STATUS);
0977 if (reg & FAN_STATUS_MONEN)
0978 data->fan_enabled |= (1 << i);
0979 }
0980
0981 if (!data->fan_enabled) {
0982 dev_dbg(dev, "Enabling monitoring of all fans\n");
0983 for (i = 0; i < 8; i++) {
0984 if (!(sio_data->has_fanin & (1 << i)))
0985 continue;
0986 pc87427_write8_bank(data, LD_FAN, BANK_FM(i),
0987 PC87427_REG_FAN_STATUS,
0988 FAN_STATUS_MONEN);
0989 }
0990 data->fan_enabled = sio_data->has_fanin;
0991 }
0992
0993
0994 for (i = 0; i < 4; i++) {
0995 if (!(sio_data->has_fanout & (1 << i)))
0996 continue;
0997 reg = pc87427_read8_bank(data, LD_FAN, BANK_FC(i),
0998 PC87427_REG_PWM_ENABLE);
0999 if (reg & PWM_ENABLE_CTLEN)
1000 data->pwm_enabled |= (1 << i);
1001
1002
1003
1004
1005
1006
1007 if ((reg & PWM_ENABLE_MODE_MASK) == PWM_MODE_AUTO) {
1008 dev_dbg(dev, "PWM%d is in automatic control mode\n",
1009 i + 1);
1010 data->pwm_auto_ok |= (1 << i);
1011 }
1012 }
1013
1014
1015 reg = pc87427_read8(data, LD_TEMP, PC87427_REG_BANK);
1016 if (!(reg & 0x80))
1017 dev_warn(dev, "%s module not ready!\n", "HMC");
1018
1019
1020 for (i = 0; i < 6; i++) {
1021 reg = pc87427_read8_bank(data, LD_TEMP, BANK_TM(i),
1022 PC87427_REG_TEMP_STATUS);
1023 if (reg & TEMP_STATUS_CHANEN)
1024 data->temp_enabled |= (1 << i);
1025 }
1026 }
1027
1028 static void pc87427_remove_files(struct device *dev)
1029 {
1030 struct pc87427_data *data = dev_get_drvdata(dev);
1031 int i;
1032
1033 device_remove_file(dev, &dev_attr_name);
1034 for (i = 0; i < 8; i++) {
1035 if (!(data->fan_enabled & (1 << i)))
1036 continue;
1037 sysfs_remove_group(&dev->kobj, &pc87427_group_fan[i]);
1038 }
1039 for (i = 0; i < 4; i++) {
1040 if (!(data->pwm_enabled & (1 << i)))
1041 continue;
1042 sysfs_remove_group(&dev->kobj, &pc87427_group_pwm[i]);
1043 }
1044 for (i = 0; i < 6; i++) {
1045 if (!(data->temp_enabled & (1 << i)))
1046 continue;
1047 sysfs_remove_group(&dev->kobj, &pc87427_group_temp[i]);
1048 }
1049 }
1050
1051 static int pc87427_probe(struct platform_device *pdev)
1052 {
1053 struct pc87427_sio_data *sio_data = dev_get_platdata(&pdev->dev);
1054 struct pc87427_data *data;
1055 int i, err, res_count;
1056
1057 data = devm_kzalloc(&pdev->dev, sizeof(struct pc87427_data),
1058 GFP_KERNEL);
1059 if (!data)
1060 return -ENOMEM;
1061
1062 data->address[0] = sio_data->address[0];
1063 data->address[1] = sio_data->address[1];
1064 res_count = (data->address[0] != 0) + (data->address[1] != 0);
1065
1066 err = pc87427_request_regions(pdev, res_count);
1067 if (err)
1068 return err;
1069
1070 mutex_init(&data->lock);
1071 data->name = "pc87427";
1072 platform_set_drvdata(pdev, data);
1073 pc87427_init_device(&pdev->dev);
1074
1075
1076 err = device_create_file(&pdev->dev, &dev_attr_name);
1077 if (err)
1078 return err;
1079 for (i = 0; i < 8; i++) {
1080 if (!(data->fan_enabled & (1 << i)))
1081 continue;
1082 err = sysfs_create_group(&pdev->dev.kobj,
1083 &pc87427_group_fan[i]);
1084 if (err)
1085 goto exit_remove_files;
1086 }
1087 for (i = 0; i < 4; i++) {
1088 if (!(data->pwm_enabled & (1 << i)))
1089 continue;
1090 err = sysfs_create_group(&pdev->dev.kobj,
1091 &pc87427_group_pwm[i]);
1092 if (err)
1093 goto exit_remove_files;
1094 }
1095 for (i = 0; i < 6; i++) {
1096 if (!(data->temp_enabled & (1 << i)))
1097 continue;
1098 err = sysfs_create_group(&pdev->dev.kobj,
1099 &pc87427_group_temp[i]);
1100 if (err)
1101 goto exit_remove_files;
1102 }
1103
1104 data->hwmon_dev = hwmon_device_register(&pdev->dev);
1105 if (IS_ERR(data->hwmon_dev)) {
1106 err = PTR_ERR(data->hwmon_dev);
1107 dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
1108 goto exit_remove_files;
1109 }
1110
1111 return 0;
1112
1113 exit_remove_files:
1114 pc87427_remove_files(&pdev->dev);
1115 return err;
1116 }
1117
1118 static int pc87427_remove(struct platform_device *pdev)
1119 {
1120 struct pc87427_data *data = platform_get_drvdata(pdev);
1121
1122 hwmon_device_unregister(data->hwmon_dev);
1123 pc87427_remove_files(&pdev->dev);
1124
1125 return 0;
1126 }
1127
1128
1129 static struct platform_driver pc87427_driver = {
1130 .driver = {
1131 .name = DRVNAME,
1132 },
1133 .probe = pc87427_probe,
1134 .remove = pc87427_remove,
1135 };
1136
1137 static int __init pc87427_device_add(const struct pc87427_sio_data *sio_data)
1138 {
1139 struct resource res[2] = {
1140 { .flags = IORESOURCE_IO },
1141 { .flags = IORESOURCE_IO },
1142 };
1143 int err, i, res_count;
1144
1145 res_count = 0;
1146 for (i = 0; i < 2; i++) {
1147 if (!sio_data->address[i])
1148 continue;
1149 res[res_count].start = sio_data->address[i];
1150 res[res_count].end = sio_data->address[i] + REGION_LENGTH - 1;
1151 res[res_count].name = logdev_str[i];
1152
1153 err = acpi_check_resource_conflict(&res[res_count]);
1154 if (err)
1155 goto exit;
1156
1157 res_count++;
1158 }
1159
1160 pdev = platform_device_alloc(DRVNAME, res[0].start);
1161 if (!pdev) {
1162 err = -ENOMEM;
1163 pr_err("Device allocation failed\n");
1164 goto exit;
1165 }
1166
1167 err = platform_device_add_resources(pdev, res, res_count);
1168 if (err) {
1169 pr_err("Device resource addition failed (%d)\n", err);
1170 goto exit_device_put;
1171 }
1172
1173 err = platform_device_add_data(pdev, sio_data,
1174 sizeof(struct pc87427_sio_data));
1175 if (err) {
1176 pr_err("Platform data allocation failed\n");
1177 goto exit_device_put;
1178 }
1179
1180 err = platform_device_add(pdev);
1181 if (err) {
1182 pr_err("Device addition failed (%d)\n", err);
1183 goto exit_device_put;
1184 }
1185
1186 return 0;
1187
1188 exit_device_put:
1189 platform_device_put(pdev);
1190 exit:
1191 return err;
1192 }
1193
1194 static int __init pc87427_find(int sioaddr, struct pc87427_sio_data *sio_data)
1195 {
1196 u16 val;
1197 u8 cfg, cfg_b;
1198 int i, err;
1199
1200 err = superio_enter(sioaddr);
1201 if (err)
1202 return err;
1203
1204
1205 val = force_id ? force_id : superio_inb(sioaddr, SIOREG_DEVID);
1206 if (val != 0xf2) {
1207 err = -ENODEV;
1208 goto exit;
1209 }
1210
1211 for (i = 0; i < 2; i++) {
1212 sio_data->address[i] = 0;
1213
1214 superio_outb(sioaddr, SIOREG_LDSEL, logdev[i]);
1215
1216 val = superio_inb(sioaddr, SIOREG_ACT);
1217 if (!(val & 0x01)) {
1218 pr_info("Logical device 0x%02x not activated\n",
1219 logdev[i]);
1220 continue;
1221 }
1222
1223 val = superio_inb(sioaddr, SIOREG_MAP);
1224 if (val & 0x01) {
1225 pr_warn("Logical device 0x%02x is memory-mapped, can't use\n",
1226 logdev[i]);
1227 continue;
1228 }
1229
1230 val = (superio_inb(sioaddr, SIOREG_IOBASE) << 8)
1231 | superio_inb(sioaddr, SIOREG_IOBASE + 1);
1232 if (!val) {
1233 pr_info("I/O base address not set for logical device 0x%02x\n",
1234 logdev[i]);
1235 continue;
1236 }
1237 sio_data->address[i] = val;
1238 }
1239
1240
1241 if (!sio_data->address[0] && !sio_data->address[1]) {
1242 err = -ENODEV;
1243 goto exit;
1244 }
1245
1246
1247 sio_data->has_fanin = (1 << 2) | (1 << 3);
1248
1249 cfg = superio_inb(sioaddr, SIOREG_CF2);
1250 if (!(cfg & (1 << 3)))
1251 sio_data->has_fanin |= (1 << 0);
1252 if (!(cfg & (1 << 2)))
1253 sio_data->has_fanin |= (1 << 4);
1254
1255 cfg = superio_inb(sioaddr, SIOREG_CFD);
1256 if (!(cfg & (1 << 0)))
1257 sio_data->has_fanin |= (1 << 1);
1258
1259 cfg = superio_inb(sioaddr, SIOREG_CF4);
1260 if (!(cfg & (1 << 0)))
1261 sio_data->has_fanin |= (1 << 7);
1262 cfg_b = superio_inb(sioaddr, SIOREG_CFB);
1263 if (!(cfg & (1 << 1)) && (cfg_b & (1 << 3)))
1264 sio_data->has_fanin |= (1 << 5);
1265 cfg = superio_inb(sioaddr, SIOREG_CF3);
1266 if ((cfg & (1 << 3)) && !(cfg_b & (1 << 5)))
1267 sio_data->has_fanin |= (1 << 6);
1268
1269
1270 sio_data->has_fanout = (1 << 0);
1271 if (cfg_b & (1 << 0))
1272 sio_data->has_fanout |= (1 << 3);
1273
1274 cfg = superio_inb(sioaddr, SIOREG_CFC);
1275 if (!(cfg & (1 << 4))) {
1276 if (cfg_b & (1 << 1))
1277 sio_data->has_fanout |= (1 << 1);
1278 if (cfg_b & (1 << 2))
1279 sio_data->has_fanout |= (1 << 2);
1280 }
1281
1282
1283 cfg = superio_inb(sioaddr, SIOREG_CF5);
1284 if (cfg & (1 << 6))
1285 sio_data->has_fanout |= (1 << 1);
1286 if (cfg & (1 << 5))
1287 sio_data->has_fanout |= (1 << 2);
1288
1289 exit:
1290 superio_exit(sioaddr);
1291 return err;
1292 }
1293
1294 static int __init pc87427_init(void)
1295 {
1296 int err;
1297 struct pc87427_sio_data sio_data;
1298
1299 if (pc87427_find(0x2e, &sio_data)
1300 && pc87427_find(0x4e, &sio_data))
1301 return -ENODEV;
1302
1303 err = platform_driver_register(&pc87427_driver);
1304 if (err)
1305 goto exit;
1306
1307
1308 err = pc87427_device_add(&sio_data);
1309 if (err)
1310 goto exit_driver;
1311
1312 return 0;
1313
1314 exit_driver:
1315 platform_driver_unregister(&pc87427_driver);
1316 exit:
1317 return err;
1318 }
1319
1320 static void __exit pc87427_exit(void)
1321 {
1322 platform_device_unregister(pdev);
1323 platform_driver_unregister(&pc87427_driver);
1324 }
1325
1326 MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");
1327 MODULE_DESCRIPTION("PC87427 hardware monitoring driver");
1328 MODULE_LICENSE("GPL");
1329
1330 module_init(pc87427_init);
1331 module_exit(pc87427_exit);