module_param(force_start, bool, 0);
 MODULE_PARM_DESC(force_start, "Force the chip to start monitoring inputs");
 
+static unsigned short force_id;
+module_param(force_id, ushort, 0);
+MODULE_PARM_DESC(force_id, "Override the detected device ID");
+
 /* Addresses to scan */
 static unsigned short normal_i2c[] = {0x2c, 0x2d, 0x2e, I2C_CLIENT_END};
 
        /* Check device ID
         * We currently know about SCH3112 (0x7c), SCH3114 (0x7d), and
         * SCH3116 (0x7f). */
-       reg = dme1737_sio_inb(sio_cip, 0x20);
+       reg = force_id ? force_id : dme1737_sio_inb(sio_cip, 0x20);
        if (!(reg == 0x7c || reg == 0x7d || reg == 0x7f)) {
                err = -ENODEV;
                goto exit;
 
 #include <linux/ioport.h>
 #include <asm/io.h>
 
+static unsigned short force_id;
+module_param(force_id, ushort, 0);
+MODULE_PARM_DESC(force_id, "Override the detected device ID");
+
 static struct platform_device *pdev;
 
 #define DRVNAME "f71805f"
        if (devid != SIO_FINTEK_ID)
                goto exit;
 
-       devid = superio_inw(sioaddr, SIO_REG_DEVID);
+       devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID);
        switch (devid) {
        case SIO_F71805F_ID:
                sio_data->kind = f71805f;
 
 
 #define FAN_MIN_DETECT                 366 /* Lowest detectable fanspeed */
 
+static unsigned short force_id;
+module_param(force_id, ushort, 0);
+MODULE_PARM_DESC(force_id, "Override the detected device ID");
+
 static struct platform_device *f71882fg_pdev = NULL;
 
 /* Super-I/O Function prototypes */
                goto exit;
        }
 
-       devid = superio_inw(sioaddr, SIO_REG_DEVID);
+       devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID);
        if (devid != SIO_F71882_ID) {
                printk(KERN_INFO DRVNAME ": Unsupported Fintek device\n");
                goto exit;
 
 
 enum chips { it87, it8712, it8716, it8718 };
 
+static unsigned short force_id;
+module_param(force_id, ushort, 0);
+MODULE_PARM_DESC(force_id, "Override the detected device ID");
+
 static struct platform_device *pdev;
 
 #define        REG     0x2e    /* The register to read/write */
        u16 chip_type;
 
        superio_enter();
-       chip_type = superio_inw(DEVID);
+       chip_type = force_id ? force_id : superio_inw(DEVID);
 
        switch (chip_type) {
        case IT8705F_DEVID:
 
  " 2: Forcibly enable all voltage and temperature channels, except in9\n"
  " 3: Forcibly enable all voltage and temperature channels, including in9");
 
+static unsigned short force_id;
+module_param(force_id, ushort, 0);
+MODULE_PARM_DESC(force_id, "Override the detected device ID");
+
 /*
  * Super-I/O registers and operations
  */
        /* No superio_enter */
 
        /* Identify device */
-       val = superio_inb(sioaddr, DEVID);
+       val = force_id ? force_id : superio_inb(sioaddr, DEVID);
        switch (val) {
        case 0xE1: /* PC87360 */
        case 0xE8: /* PC87363 */
 
 #include <linux/ioport.h>
 #include <asm/io.h>
 
+static unsigned short force_id;
+module_param(force_id, ushort, 0);
+MODULE_PARM_DESC(force_id, "Override the detected device ID");
+
 static struct platform_device *pdev;
 
 #define DRVNAME "pc87427"
        int i, err = 0;
 
        /* Identify device */
-       val = superio_inb(sioaddr, SIOREG_DEVID);
+       val = force_id ? force_id : superio_inb(sioaddr, SIOREG_DEVID);
        if (val != 0xf2) {      /* PC87427 */
                err = -ENODEV;
                goto exit;
 
 #include <linux/mutex.h>
 #include <asm/io.h>
 
+static unsigned short force_id;
+module_param(force_id, ushort, 0);
+MODULE_PARM_DESC(force_id, "Override the detected device ID");
+
 static struct platform_device *pdev;
 
 #define DRVNAME "smsc47b397"
        u8 id, rev;
 
        superio_enter();
-       id = superio_inb(SUPERIO_REG_DEVID);
+       id = force_id ? force_id : superio_inb(SUPERIO_REG_DEVID);
 
        if ((id != 0x6f) && (id != 0x81) && (id != 0x85)) {
                superio_exit();
 
 #include <linux/sysfs.h>
 #include <asm/io.h>
 
+static unsigned short force_id;
+module_param(force_id, ushort, 0);
+MODULE_PARM_DESC(force_id, "Override the detected device ID");
+
 static struct platform_device *pdev;
 
 #define DRVNAME "smsc47m1"
        u8 val;
 
        superio_enter();
-       val = superio_inb(SUPERIO_REG_DEVID);
+       val = force_id ? force_id : superio_inb(SUPERIO_REG_DEVID);
 
        /*
         * SMSC LPC47M10x/LPC47M112/LPC47M13x (device id 0x59), LPC47M14x
 
 module_param(int_mode, int, 0);
 MODULE_PARM_DESC(int_mode, "Force the temperature interrupt mode");
 
+static unsigned short force_id;
+module_param(force_id, ushort, 0);
+MODULE_PARM_DESC(force_id, "Override the detected device ID");
+
 static struct platform_device *pdev;
 
 #define DRVNAME "vt1211"
 static int __init vt1211_find(int sio_cip, unsigned short *address)
 {
        int err = -ENODEV;
+       int devid;
 
        superio_enter(sio_cip);
 
-       if (superio_inb(sio_cip, SIO_VT1211_DEVID) != SIO_VT1211_ID) {
+       devid = force_id ? force_id : superio_inb(sio_cip, SIO_VT1211_DEVID);
+       if (devid != SIO_VT1211_ID) {
                goto EXIT;
        }
 
 
        "w83627dhg",
 };
 
+static unsigned short force_id;
+module_param(force_id, ushort, 0);
+MODULE_PARM_DESC(force_id, "Override the detected device ID");
+
 #define DRVNAME "w83627ehf"
 
 /*
 
        superio_enter(sioaddr);
 
-       val = (superio_inb(sioaddr, SIO_REG_DEVID) << 8)
-           | superio_inb(sioaddr, SIO_REG_DEVID + 1);
+       if (force_id)
+               val = force_id;
+       else
+               val = (superio_inb(sioaddr, SIO_REG_DEVID) << 8)
+                   | superio_inb(sioaddr, SIO_REG_DEVID + 1);
        switch (val & SIO_ID_MASK) {
        case SIO_W83627EHF_ID:
                sio_data->kind = w83627ehf;
 
 module_param(init, bool, 0);
 MODULE_PARM_DESC(init, "Set to zero to bypass chip initialization");
 
+static unsigned short force_id;
+module_param(force_id, ushort, 0);
+MODULE_PARM_DESC(force_id, "Override the detected device ID");
+
 /* modified from kernel/include/traps.c */
 static int REG;                /* The register to read/write */
 #define        DEV     0x07    /* Register: Logical device select */
        VAL = sioaddr + 1;
 
        superio_enter();
-       val= superio_inb(DEVID);
+       val = force_id ? force_id : superio_inb(DEVID);
        switch (val) {
        case W627_DEVID:
                sio_data->type = w83627hf;