Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvar...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 24 May 2011 22:20:02 +0000 (15:20 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 24 May 2011 22:20:02 +0000 (15:20 -0700)
* 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging:
  i2c-parport: Various cleanups
  i2c-i801: Don't depend on other kernel driver config options
  i2c-i801: Check for vendor Fujitsu before probing for apanel
  i2c-i801: Don't probe for slaves on IDF channels
  i2c-i801: SMBus patch for Intel Panther Point DeviceIDs
  i2c/writing-clients: Fix foo_driver.id_table

Documentation/i2c/busses/i2c-i801
Documentation/i2c/writing-clients
drivers/i2c/busses/Kconfig
drivers/i2c/busses/i2c-i801.c
drivers/i2c/busses/i2c-parport-light.c
drivers/i2c/busses/i2c-parport.c
drivers/i2c/busses/i2c-parport.h

index 6df6976..2871fd5 100644 (file)
@@ -19,6 +19,7 @@ Supported adapters:
   * Intel 6 Series (PCH)
   * Intel Patsburg (PCH)
   * Intel DH89xxCC (PCH)
+  * Intel Panther Point (PCH)
    Datasheets: Publicly available at the Intel website
 
 On Intel Patsburg and later chipsets, both the normal host SMBus controller
index 5ebf5af..5aa5337 100644 (file)
@@ -38,7 +38,7 @@ static struct i2c_driver foo_driver = {
                .name   = "foo",
        },
 
-       .id_table       = foo_ids,
+       .id_table       = foo_idtable,
        .probe          = foo_probe,
        .remove         = foo_remove,
        /* if device autodetection is needed: */
index 326652f..428d098 100644 (file)
@@ -79,6 +79,7 @@ config I2C_AMD8111
 config I2C_I801
        tristate "Intel 82801 (ICH/PCH)"
        depends on PCI
+       select CHECK_SIGNATURE if X86 && DMI
        help
          If you say yes to this option, support will be included for the Intel
          801 family of mainboard I2C interfaces.  Specifically, the following
@@ -101,6 +102,7 @@ config I2C_I801
            6 Series (PCH)
            Patsburg (PCH)
            DH89xxCC (PCH)
+           Panther Point (PCH)
 
          This driver can also be built as a module.  If so, the module
          will be called i2c-i801.
index ec36208..ab26840 100644 (file)
@@ -50,6 +50,7 @@
   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
 
   Features supported by this driver:
   Software PEC                     no
 /* 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_PANTHERPOINT_SMBUS 0x1e22
 /* 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_PANTHERPOINT_SMBUS 0x1e22
 #define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS     0x2330
 #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS        0x3b30
 
@@ -159,6 +160,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",
@@ -629,12 +632,13 @@ 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) },
        { 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" */
@@ -664,11 +668,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;
@@ -734,7 +734,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)
@@ -754,6 +777,11 @@ 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:
+               priv->features |= FEATURE_IDF;
+               /* fall through */
        default:
                priv->features |= FEATURE_I2C_BLOCK_READ;
                /* fall through */
@@ -839,21 +867,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;
@@ -913,7 +927,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);
 }
 
index fc5fbd1..4b95f7a 100644 (file)
@@ -2,13 +2,13 @@
  * i2c-parport-light.c I2C bus over parallel port                           *
  * ------------------------------------------------------------------------ *
    Copyright (C) 2003-2010 Jean Delvare <khali@linux-fr.org>
-   
+
    Based on older i2c-velleman.c driver
    Copyright (C) 1995-2000 Simon G. Vogl
    With some changes from:
    Frodo Looijaard <frodol@dds.nl>
    Kyösti Mälkki <kmalkki@cc.hut.fi>
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
@@ -114,7 +114,7 @@ static struct i2c_algo_bit_data parport_algo_data = {
        .getscl         = parport_getscl,
        .udelay         = 50,
        .timeout        = HZ,
-}; 
+};
 
 /* ----- Driver registration ---------------------------------------------- */
 
@@ -132,7 +132,7 @@ static struct i2c_smbus_alert_setup alert_data = {
 static struct i2c_client *ara;
 static struct lineop parport_ctrl_irq = {
        .val            = (1 << 4),
-       .port           = CTRL,
+       .port           = PORT_CTRL,
 };
 
 static int __devinit i2c_parport_probe(struct platform_device *pdev)
@@ -245,7 +245,7 @@ static int __init i2c_parport_init(void)
        if (irq != 0)
                pr_info(DRVNAME ": using irq %d\n", irq);
 
-        if (!adapter_parm[type].getscl.val)
+       if (!adapter_parm[type].getscl.val)
                parport_algo_data.getscl = NULL;
 
        /* Sets global pdev as a side effect */
index 2dbba16..2456568 100644 (file)
@@ -2,13 +2,13 @@
  * i2c-parport.c I2C bus over parallel port                                 *
  * ------------------------------------------------------------------------ *
    Copyright (C) 2003-2011 Jean Delvare <khali@linux-fr.org>
-   
+
    Based on older i2c-philips-par.c driver
    Copyright (C) 1995-2000 Simon G. Vogl
    With some changes from:
    Frodo Looijaard <frodol@dds.nl>
    Kyösti Mälkki <kmalkki@cc.hut.fi>
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
@@ -78,13 +78,13 @@ static unsigned char port_read_control(struct parport *p)
        return parport_read_control(p);
 }
 
-static void (*port_write[])(struct parport *, unsigned char) = {
+static void (* const port_write[])(struct parport *, unsigned char) = {
        port_write_data,
        NULL,
        port_write_control,
 };
 
-static unsigned char (*port_read[])(struct parport *) = {
+static unsigned char (* const port_read[])(struct parport *) = {
        port_read_data,
        port_read_status,
        port_read_control,
@@ -147,7 +147,7 @@ static const struct i2c_algo_bit_data parport_algo_data = {
        .getscl         = parport_getscl,
        .udelay         = 10, /* ~50 kbps */
        .timeout        = HZ,
-}; 
+};
 
 /* ----- I2c and parallel port call-back functions and structures --------- */
 
@@ -164,10 +164,10 @@ void i2c_parport_irq(void *data)
                        "SMBus alert received but no ARA client!\n");
 }
 
-static void i2c_parport_attach (struct parport *port)
+static void i2c_parport_attach(struct parport *port)
 {
        struct i2c_par *adapter;
-       
+
        adapter = kzalloc(sizeof(struct i2c_par), GFP_KERNEL);
        if (adapter == NULL) {
                printk(KERN_ERR "i2c-parport: Failed to kzalloc\n");
@@ -180,7 +180,7 @@ static void i2c_parport_attach (struct parport *port)
                NULL, NULL, i2c_parport_irq, PARPORT_FLAG_EXCL, adapter);
        if (!adapter->pdev) {
                printk(KERN_ERR "i2c-parport: Unable to register with parport\n");
-               goto ERROR0;
+               goto err_free;
        }
 
        /* Fill the rest of the structure */
@@ -200,7 +200,7 @@ static void i2c_parport_attach (struct parport *port)
 
        if (parport_claim_or_block(adapter->pdev) < 0) {
                printk(KERN_ERR "i2c-parport: Could not claim parallel port\n");
-               goto ERROR1;
+               goto err_unregister;
        }
 
        /* Reset hardware to a sane state (SCL and SDA high) */
@@ -215,7 +215,7 @@ static void i2c_parport_attach (struct parport *port)
 
        if (i2c_bit_add_bus(&adapter->adapter) < 0) {
                printk(KERN_ERR "i2c-parport: Unable to register with I2C\n");
-               goto ERROR1;
+               goto err_unregister;
        }
 
        /* Setup SMBus alert if supported */
@@ -234,16 +234,16 @@ static void i2c_parport_attach (struct parport *port)
        mutex_lock(&adapter_list_lock);
        list_add_tail(&adapter->node, &adapter_list);
        mutex_unlock(&adapter_list_lock);
-        return;
+       return;
 
-ERROR1:
+ err_unregister:
        parport_release(adapter->pdev);
        parport_unregister_device(adapter->pdev);
-ERROR0:
+ err_free:
        kfree(adapter);
 }
 
-static void i2c_parport_detach (struct parport *port)
+static void i2c_parport_detach(struct parport *port)
 {
        struct i2c_par *adapter, *_n;
 
@@ -260,7 +260,7 @@ static void i2c_parport_detach (struct parport *port)
                        /* Un-init if needed (power off...) */
                        if (adapter_parm[type].init.val)
                                line_set(port, 0, &adapter_parm[type].init);
-                               
+
                        parport_release(adapter->pdev);
                        parport_unregister_device(adapter->pdev);
                        list_del(&adapter->node);
index a9f6681..3fe6523 100644 (file)
@@ -2,7 +2,7 @@
  * i2c-parport.h I2C bus over parallel port                                 *
  * ------------------------------------------------------------------------ *
    Copyright (C) 2003-2010 Jean Delvare <khali@linux-fr.org>
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  * ------------------------------------------------------------------------ */
 
-#ifdef DATA
-#undef DATA
-#endif
-
-#define DATA   0
-#define STAT   1
-#define CTRL   2
+#define PORT_DATA      0
+#define PORT_STAT      1
+#define PORT_CTRL      2
 
 struct lineop {
        u8 val;
@@ -41,61 +37,61 @@ struct adapter_parm {
        unsigned int smbus_alert:1;
 };
 
-static struct adapter_parm adapter_parm[] = {
+static const struct adapter_parm adapter_parm[] = {
        /* type 0: Philips adapter */
        {
-               .setsda = { 0x80, DATA, 1 },
-               .setscl = { 0x08, CTRL, 0 },
-               .getsda = { 0x80, STAT, 0 },
-               .getscl = { 0x08, STAT, 0 },
+               .setsda = { 0x80, PORT_DATA, 1 },
+               .setscl = { 0x08, PORT_CTRL, 0 },
+               .getsda = { 0x80, PORT_STAT, 0 },
+               .getscl = { 0x08, PORT_STAT, 0 },
        },
        /* type 1: home brew teletext adapter */
        {
-               .setsda = { 0x02, DATA, 0 },
-               .setscl = { 0x01, DATA, 0 },
-               .getsda = { 0x80, STAT, 1 },
+               .setsda = { 0x02, PORT_DATA, 0 },
+               .setscl = { 0x01, PORT_DATA, 0 },
+               .getsda = { 0x80, PORT_STAT, 1 },
        },
        /* type 2: Velleman K8000 adapter */
        {
-               .setsda = { 0x02, CTRL, 1 },
-               .setscl = { 0x08, CTRL, 1 },
-               .getsda = { 0x10, STAT, 0 },
+               .setsda = { 0x02, PORT_CTRL, 1 },
+               .setscl = { 0x08, PORT_CTRL, 1 },
+               .getsda = { 0x10, PORT_STAT, 0 },
        },
        /* type 3: ELV adapter */
        {
-               .setsda = { 0x02, DATA, 1 },
-               .setscl = { 0x01, DATA, 1 },
-               .getsda = { 0x40, STAT, 1 },
-               .getscl = { 0x08, STAT, 1 },
+               .setsda = { 0x02, PORT_DATA, 1 },
+               .setscl = { 0x01, PORT_DATA, 1 },
+               .getsda = { 0x40, PORT_STAT, 1 },
+               .getscl = { 0x08, PORT_STAT, 1 },
        },
        /* type 4: ADM1032 evaluation board */
        {
-               .setsda = { 0x02, DATA, 1 },
-               .setscl = { 0x01, DATA, 1 },
-               .getsda = { 0x10, STAT, 1 },
-               .init   = { 0xf0, DATA, 0 },
+               .setsda = { 0x02, PORT_DATA, 1 },
+               .setscl = { 0x01, PORT_DATA, 1 },
+               .getsda = { 0x10, PORT_STAT, 1 },
+               .init   = { 0xf0, PORT_DATA, 0 },
                .smbus_alert = 1,
        },
        /* type 5: ADM1025, ADM1030 and ADM1031 evaluation boards */
        {
-               .setsda = { 0x02, DATA, 1 },
-               .setscl = { 0x01, DATA, 1 },
-               .getsda = { 0x10, STAT, 1 },
+               .setsda = { 0x02, PORT_DATA, 1 },
+               .setscl = { 0x01, PORT_DATA, 1 },
+               .getsda = { 0x10, PORT_STAT, 1 },
        },
        /* type 6: Barco LPT->DVI (K5800236) adapter */
        {
-               .setsda = { 0x02, DATA, 1 },
-               .setscl = { 0x01, DATA, 1 },
-               .getsda = { 0x20, STAT, 0 },
-               .getscl = { 0x40, STAT, 0 },
-               .init   = { 0xfc, DATA, 0 },
+               .setsda = { 0x02, PORT_DATA, 1 },
+               .setscl = { 0x01, PORT_DATA, 1 },
+               .getsda = { 0x20, PORT_STAT, 0 },
+               .getscl = { 0x40, PORT_STAT, 0 },
+               .init   = { 0xfc, PORT_DATA, 0 },
        },
        /* type 7: One For All JP1 parallel port adapter */
        {
-               .setsda = { 0x01, DATA, 0 },
-               .setscl = { 0x02, DATA, 0 },
-               .getsda = { 0x80, STAT, 1 },
-               .init   = { 0x04, DATA, 1 },
+               .setsda = { 0x01, PORT_DATA, 0 },
+               .setscl = { 0x02, PORT_DATA, 0 },
+               .getsda = { 0x80, PORT_STAT, 1 },
+               .init   = { 0x04, PORT_DATA, 1 },
        },
 };