hwmon: (it87) Fix in7 on IT8720F
[deliverable/linux.git] / drivers / hwmon / it87.c
index 5be09c048c5f35bc8b19914b58a20e3b4c3e32d5..25763d2223b664aeb16af5e3d2c43592265cff68 100644 (file)
@@ -80,6 +80,13 @@ superio_inb(int reg)
        return inb(VAL);
 }
 
+static inline void
+superio_outb(int reg, int val)
+{
+       outb(reg, REG);
+       outb(val, VAL);
+}
+
 static int superio_inw(int reg)
 {
        int val;
@@ -1517,6 +1524,21 @@ static int __init it87_find(unsigned short *address,
                        sio_data->vid_value = superio_inb(IT87_SIO_VID_REG);
 
                reg = superio_inb(IT87_SIO_PINX2_REG);
+               /*
+                * The IT8720F has no VIN7 pin, so VCCH should always be
+                * routed internally to VIN7 with an internal divider.
+                * Curiously, there still is a configuration bit to control
+                * this, which means it can be set incorrectly. And even
+                * more curiously, many boards out there are improperly
+                * configured, even though the IT8720F datasheet claims
+                * that the internal routing of VCCH to VIN7 is the default
+                * setting. So we force the internal routing in this case.
+                */
+               if (sio_data->type == it8720 && !(reg & (1 << 1))) {
+                       reg |= (1 << 1);
+                       superio_outb(IT87_SIO_PINX2_REG, reg);
+                       pr_notice("it87: Routing internal VCCH to in7\n");
+               }
                if (reg & (1 << 0))
                        pr_info("it87: in3 is VCC (+5V)\n");
                if (reg & (1 << 1))
This page took 0.030432 seconds and 5 git commands to generate.