i2c: i801: Add DeviceIDs for SunrisePoint LP
[pandora-kernel.git] / drivers / i2c / busses / i2c-i801.c
index 455e909..6524f47 100644 (file)
 */
 
 /*
-  Supports the following Intel I/O Controller Hubs (ICH):
-
-                                  I/O                     Block   I2C
-                                  region  SMBus   Block   proc.   block
-  Chip name             PCI ID    size    PEC     buffer  call    read
-  ----------------------------------------------------------------------
-  82801AA  (ICH)        0x2413     16      no      no      no      no
-  82801AB  (ICH0)       0x2423     16      no      no      no      no
-  82801BA  (ICH2)       0x2443     16      no      no      no      no
-  82801CA  (ICH3)       0x2483     32     soft     no      no      no
-  82801DB  (ICH4)       0x24c3     32     hard     yes     no      no
-  82801E   (ICH5)       0x24d3     32     hard     yes     yes     yes
-  6300ESB               0x25a4     32     hard     yes     yes     yes
-  82801F   (ICH6)       0x266a     32     hard     yes     yes     yes
-  6310ESB/6320ESB       0x269b     32     hard     yes     yes     yes
-  82801G   (ICH7)       0x27da     32     hard     yes     yes     yes
-  82801H   (ICH8)       0x283e     32     hard     yes     yes     yes
-  82801I   (ICH9)       0x2930     32     hard     yes     yes     yes
-  EP80579 (Tolapai)     0x5032     32     hard     yes     yes     yes
-  ICH10                 0x3a30     32     hard     yes     yes     yes
-  ICH10                 0x3a60     32     hard     yes     yes     yes
-  5/3400 Series (PCH)   0x3b30     32     hard     yes     yes     yes
-  6 Series (PCH)        0x1c22     32     hard     yes     yes     yes
-  Patsburg (PCH)        0x1d22     32     hard     yes     yes     yes
-  Patsburg (PCH) IDF    0x1d70     32     hard     yes     yes     yes
-  Patsburg (PCH) IDF    0x1d71     32     hard     yes     yes     yes
-  Patsburg (PCH) IDF    0x1d72     32     hard     yes     yes     yes
-  DH89xxCC (PCH)        0x2330     32     hard     yes     yes     yes
-
-  Features supported by this driver:
-  Software PEC                     no
-  Hardware PEC                     yes
-  Block buffer                     yes
-  Block process call transaction   no
-  I2C block read transaction       yes  (doesn't use the block buffer)
-  Slave mode                       no
-
-  See the file Documentation/i2c/busses/i2c-i801 for details.
-*/
+ * Supports the following Intel I/O Controller Hubs (ICH):
+ *
+ *                                     I/O                     Block   I2C
+ *                                     region  SMBus   Block   proc.   block
+ * Chip name                   PCI ID  size    PEC     buffer  call    read
+ * ---------------------------------------------------------------------------
+ * 82801AA (ICH)               0x2413  16      no      no      no      no
+ * 82801AB (ICH0)              0x2423  16      no      no      no      no
+ * 82801BA (ICH2)              0x2443  16      no      no      no      no
+ * 82801CA (ICH3)              0x2483  32      soft    no      no      no
+ * 82801DB (ICH4)              0x24c3  32      hard    yes     no      no
+ * 82801E (ICH5)               0x24d3  32      hard    yes     yes     yes
+ * 6300ESB                     0x25a4  32      hard    yes     yes     yes
+ * 82801F (ICH6)               0x266a  32      hard    yes     yes     yes
+ * 6310ESB/6320ESB             0x269b  32      hard    yes     yes     yes
+ * 82801G (ICH7)               0x27da  32      hard    yes     yes     yes
+ * 82801H (ICH8)               0x283e  32      hard    yes     yes     yes
+ * 82801I (ICH9)               0x2930  32      hard    yes     yes     yes
+ * EP80579 (Tolapai)           0x5032  32      hard    yes     yes     yes
+ * ICH10                       0x3a30  32      hard    yes     yes     yes
+ * ICH10                       0x3a60  32      hard    yes     yes     yes
+ * 5/3400 Series (PCH)         0x3b30  32      hard    yes     yes     yes
+ * 6 Series (PCH)              0x1c22  32      hard    yes     yes     yes
+ * Patsburg (PCH)              0x1d22  32      hard    yes     yes     yes
+ * Patsburg (PCH) IDF          0x1d70  32      hard    yes     yes     yes
+ * Patsburg (PCH) IDF          0x1d71  32      hard    yes     yes     yes
+ * Patsburg (PCH) IDF          0x1d72  32      hard    yes     yes     yes
+ * DH89xxCC (PCH)              0x2330  32      hard    yes     yes     yes
+ * Panther Point (PCH)         0x1e22  32      hard    yes     yes     yes
+ * Lynx Point (PCH)            0x8c22  32      hard    yes     yes     yes
+ * Lynx Point-LP (PCH)         0x9c22  32      hard    yes     yes     yes
+ * Avoton (SOC)                        0x1f3c  32      hard    yes     yes     yes
+ * Wellsburg (PCH)             0x8d22  32      hard    yes     yes     yes
+ * Wellsburg (PCH) MS          0x8d7d  32      hard    yes     yes     yes
+ * Wellsburg (PCH) MS          0x8d7e  32      hard    yes     yes     yes
+ * Wellsburg (PCH) MS          0x8d7f  32      hard    yes     yes     yes
+ * Coleto Creek (PCH)          0x23b0  32      hard    yes     yes     yes
+ * Wildcat Point (PCH)         0x8ca2  32      hard    yes     yes     yes
+ * Wildcat Point-LP (PCH)      0x9ca2  32      hard    yes     yes     yes
+ * BayTrail (SOC)              0x0f12  32      hard    yes     yes     yes
+ * Sunrise Point-H (PCH)       0xa123  32      hard    yes     yes     yes
+ * Sunrise Point-LP (PCH)      0x9d23  32      hard    yes     yes     yes
+ *
+ * Features supported by this driver:
+ * Software PEC                                no
+ * Hardware PEC                                yes
+ * Block buffer                                yes
+ * Block process call transaction      no
+ * I2C block read transaction          yes (doesn't use the block buffer)
+ * Slave mode                          no
+ *
+ * See the file Documentation/i2c/busses/i2c-i801 for details.
+ */
 
 #include <linux/module.h>
 #include <linux/pci.h>
                                 SMBHSTSTS_INTR)
 
 /* Older devices have their ID defined in <linux/pci_ids.h> */
-#define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS  0x1c22
-#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS     0x1d22
+#define PCI_DEVICE_ID_INTEL_BAYTRAIL_SMBUS             0x0f12
+#define PCI_DEVICE_ID_INTEL_BRASWELL_SMBUS             0x2292
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS          0x1c22
+#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS             0x1d22
 /* Patsburg also has three 'Integrated Device Function' SMBus controllers */
-#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0        0x1d70
-#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1        0x1d71
-#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2        0x1d72
-#define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS     0x2330
-#define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS        0x3b30
+#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0                0x1d70
+#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1                0x1d71
+#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2                0x1d72
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS         0x1e22
+#define PCI_DEVICE_ID_INTEL_AVOTON_SMBUS               0x1f3c
+#define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS             0x2330
+#define PCI_DEVICE_ID_INTEL_COLETOCREEK_SMBUS          0x23b0
+#define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS                0x3b30
+#define PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS            0x8c22
+#define PCI_DEVICE_ID_INTEL_WILDCATPOINT_SMBUS         0x8ca2
+#define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS            0x8d22
+#define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS0                0x8d7d
+#define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS1                0x8d7e
+#define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2                0x8d7f
+#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS         0x9c22
+#define PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_SMBUS      0x9ca2
+#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_SMBUS       0xa123
+#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_SMBUS      0x9d23
 
 struct i801_priv {
        struct i2c_adapter adapter;
@@ -158,6 +187,8 @@ static struct pci_driver i801_driver;
 #define FEATURE_BLOCK_BUFFER   (1 << 1)
 #define FEATURE_BLOCK_PROC     (1 << 2)
 #define FEATURE_I2C_BLOCK_READ (1 << 3)
+/* Not really a feature, but it's convenient to handle it as such */
+#define FEATURE_IDF            (1 << 15)
 
 static const char *i801_feature_names[] = {
        "SMBus PEC",
@@ -628,12 +659,27 @@ static const struct pci_device_id i801_ids[] = {
        { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1) },
        { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2) },
        { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_AVOTON_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS0) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS1) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COLETOCREEK_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WILDCATPOINT_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BAYTRAIL_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BRASWELL_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_SMBUS) },
        { 0, }
 };
 
 MODULE_DEVICE_TABLE(pci, i801_ids);
 
-#if defined CONFIG_INPUT_APANEL || defined CONFIG_INPUT_APANEL_MODULE
+#if defined CONFIG_X86 && defined CONFIG_DMI
 static unsigned char apanel_addr;
 
 /* Scan the system ROM for the signature "FJKEYINF" */
@@ -663,11 +709,7 @@ static void __init input_apanel_init(void)
        }
        iounmap(bios);
 }
-#else
-static void __init input_apanel_init(void) {}
-#endif
 
-#if defined CONFIG_SENSORS_FSCHMD || defined CONFIG_SENSORS_FSCHMD_MODULE
 struct dmi_onboard_device_info {
        const char *name;
        u8 type;
@@ -733,7 +775,30 @@ static void __devinit dmi_check_onboard_devices(const struct dmi_header *dm,
                dmi_check_onboard_device(type, name, adap);
        }
 }
-#endif
+
+/* Register optional slaves */
+static void __devinit i801_probe_optional_slaves(struct i801_priv *priv)
+{
+       /* Only register slaves on main SMBus channel */
+       if (priv->features & FEATURE_IDF)
+               return;
+
+       if (apanel_addr) {
+               struct i2c_board_info info;
+
+               memset(&info, 0, sizeof(struct i2c_board_info));
+               info.addr = apanel_addr;
+               strlcpy(info.type, "fujitsu_apanel", I2C_NAME_SIZE);
+               i2c_new_device(&priv->adapter, &info);
+       }
+
+       if (dmi_name_in_vendors("FUJITSU"))
+               dmi_walk(dmi_check_onboard_devices, &priv->adapter);
+}
+#else
+static void __init input_apanel_init(void) {}
+static void __devinit i801_probe_optional_slaves(struct i801_priv *priv) {}
+#endif /* CONFIG_X86 && CONFIG_DMI */
 
 static int __devinit i801_probe(struct pci_dev *dev,
                                const struct pci_device_id *id)
@@ -753,6 +818,14 @@ static int __devinit i801_probe(struct pci_dev *dev,
 
        priv->pci_dev = dev;
        switch (dev->device) {
+       case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0:
+       case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1:
+       case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2:
+       case PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS0:
+       case PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS1:
+       case PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2:
+               priv->features |= FEATURE_IDF;
+               /* fall through */
        default:
                priv->features |= FEATURE_I2C_BLOCK_READ;
                /* fall through */
@@ -838,21 +911,7 @@ static int __devinit i801_probe(struct pci_dev *dev,
                goto exit_release;
        }
 
-       /* Register optional slaves */
-#if defined CONFIG_INPUT_APANEL || defined CONFIG_INPUT_APANEL_MODULE
-       if (apanel_addr) {
-               struct i2c_board_info info;
-
-               memset(&info, 0, sizeof(struct i2c_board_info));
-               info.addr = apanel_addr;
-               strlcpy(info.type, "fujitsu_apanel", I2C_NAME_SIZE);
-               i2c_new_device(&priv->adapter, &info);
-       }
-#endif
-#if defined CONFIG_SENSORS_FSCHMD || defined CONFIG_SENSORS_FSCHMD_MODULE
-       if (dmi_name_in_vendors("FUJITSU"))
-               dmi_walk(dmi_check_onboard_devices, &priv->adapter);
-#endif
+       i801_probe_optional_slaves(priv);
 
        pci_set_drvdata(dev, priv);
        return 0;
@@ -912,7 +971,8 @@ static struct pci_driver i801_driver = {
 
 static int __init i2c_i801_init(void)
 {
-       input_apanel_init();
+       if (dmi_name_in_vendors("FUJITSU"))
+               input_apanel_init();
        return pci_register_driver(&i801_driver);
 }