hwmon/vt1211: Add probing of alternate config index port
[sfrench/cifs-2.6.git] / drivers / hwmon / vt1211.c
index 25cc56003d7aeb325277483c53915488540210fc..89c23d6add7be174190cbc90f2cf2f1b25d2be10 100644 (file)
@@ -178,9 +178,10 @@ struct vt1211_data {
  * Super-I/O constants and functions
  * --------------------------------------------------------------------- */
 
  * Super-I/O constants and functions
  * --------------------------------------------------------------------- */
 
-/* Configuration & data index port registers */
-#define SIO_REG_CIP            0x2e
-#define SIO_REG_DIP            0x2f
+/* Configuration index port registers
+ * The vt1211 can live at 2 different addresses so we need to probe both */
+#define SIO_REG_CIP1           0x2e
+#define SIO_REG_CIP2           0x4e
 
 /* Configuration registers */
 #define SIO_VT1211_LDN         0x07    /* logical device number */
 
 /* Configuration registers */
 #define SIO_VT1211_LDN         0x07    /* logical device number */
@@ -193,33 +194,33 @@ struct vt1211_data {
 /* VT1211 logical device numbers */
 #define SIO_VT1211_LDN_HWMON   0x0b    /* HW monitor */
 
 /* VT1211 logical device numbers */
 #define SIO_VT1211_LDN_HWMON   0x0b    /* HW monitor */
 
-static inline void superio_outb(int reg, int val)
+static inline void superio_outb(int sio_cip, int reg, int val)
 {
 {
-       outb(reg, SIO_REG_CIP);
-       outb(val, SIO_REG_DIP);
+       outb(reg, sio_cip);
+       outb(val, sio_cip + 1);
 }
 
 }
 
-static inline int superio_inb(int reg)
+static inline int superio_inb(int sio_cip, int reg)
 {
 {
-       outb(reg, SIO_REG_CIP);
-       return inb(SIO_REG_DIP);
+       outb(reg, sio_cip);
+       return inb(sio_cip + 1);
 }
 
 }
 
-static inline void superio_select(int ldn)
+static inline void superio_select(int sio_cip, int ldn)
 {
 {
-       outb(SIO_VT1211_LDN, SIO_REG_CIP);
-       outb(ldn, SIO_REG_DIP);
+       outb(SIO_VT1211_LDN, sio_cip);
+       outb(ldn, sio_cip + 1);
 }
 
 }
 
-static inline void superio_enter(void)
+static inline void superio_enter(int sio_cip)
 {
 {
-       outb(0x87, SIO_REG_CIP);
-       outb(0x87, SIO_REG_CIP);
+       outb(0x87, sio_cip);
+       outb(0x87, sio_cip);
 }
 
 }
 
-static inline void superio_exit(void)
+static inline void superio_exit(int sio_cip)
 {
 {
-       outb(0xaa, SIO_REG_CIP);
+       outb(0xaa, sio_cip);
 }
 
 /* ---------------------------------------------------------------------
 }
 
 /* ---------------------------------------------------------------------
@@ -1263,26 +1264,26 @@ EXIT:
        return err;
 }
 
        return err;
 }
 
-static int __init vt1211_find(unsigned short *address)
+static int __init vt1211_find(int sio_cip, unsigned short *address)
 {
        int err = -ENODEV;
 
 {
        int err = -ENODEV;
 
-       superio_enter();
+       superio_enter(sio_cip);
 
 
-       if (superio_inb(SIO_VT1211_DEVID) != SIO_VT1211_ID) {
+       if (superio_inb(sio_cip, SIO_VT1211_DEVID) != SIO_VT1211_ID) {
                goto EXIT;
        }
 
                goto EXIT;
        }
 
-       superio_select(SIO_VT1211_LDN_HWMON);
+       superio_select(sio_cip, SIO_VT1211_LDN_HWMON);
 
 
-       if ((superio_inb(SIO_VT1211_ACTIVE) & 1) == 0) {
+       if ((superio_inb(sio_cip, SIO_VT1211_ACTIVE) & 1) == 0) {
                printk(KERN_WARNING DRVNAME ": HW monitor is disabled, "
                       "skipping\n");
                goto EXIT;
        }
 
                printk(KERN_WARNING DRVNAME ": HW monitor is disabled, "
                       "skipping\n");
                goto EXIT;
        }
 
-       *address = ((superio_inb(SIO_VT1211_BADDR) << 8) |
-                   (superio_inb(SIO_VT1211_BADDR + 1))) & 0xff00;
+       *address = ((superio_inb(sio_cip, SIO_VT1211_BADDR) << 8) |
+                   (superio_inb(sio_cip, SIO_VT1211_BADDR + 1))) & 0xff00;
        if (*address == 0) {
                printk(KERN_WARNING DRVNAME ": Base address is not set, "
                       "skipping\n");
        if (*address == 0) {
                printk(KERN_WARNING DRVNAME ": Base address is not set, "
                       "skipping\n");
@@ -1291,10 +1292,11 @@ static int __init vt1211_find(unsigned short *address)
 
        err = 0;
        printk(KERN_INFO DRVNAME ": Found VT1211 chip at 0x%04x, "
 
        err = 0;
        printk(KERN_INFO DRVNAME ": Found VT1211 chip at 0x%04x, "
-              "revision %u\n", *address, superio_inb(SIO_VT1211_DEVREV));
+              "revision %u\n", *address,
+              superio_inb(sio_cip, SIO_VT1211_DEVREV));
 
 EXIT:
 
 EXIT:
-       superio_exit();
+       superio_exit(sio_cip);
        return err;
 }
 
        return err;
 }
 
@@ -1303,8 +1305,8 @@ static int __init vt1211_init(void)
        int err;
        unsigned short address = 0;
 
        int err;
        unsigned short address = 0;
 
-       err = vt1211_find(&address);
-       if (err) {
+       if ((err = vt1211_find(SIO_REG_CIP1, &address)) &&
+           (err = vt1211_find(SIO_REG_CIP2, &address))) {
                goto EXIT;
        }
 
                goto EXIT;
        }