Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging

* '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

+97 -83
+1
Documentation/i2c/busses/i2c-i801
··· 19 19 * Intel 6 Series (PCH) 20 20 * Intel Patsburg (PCH) 21 21 * Intel DH89xxCC (PCH) 22 + * Intel Panther Point (PCH) 22 23 Datasheets: Publicly available at the Intel website 23 24 24 25 On Intel Patsburg and later chipsets, both the normal host SMBus controller
+1 -1
Documentation/i2c/writing-clients
··· 38 38 .name = "foo", 39 39 }, 40 40 41 - .id_table = foo_ids, 41 + .id_table = foo_idtable, 42 42 .probe = foo_probe, 43 43 .remove = foo_remove, 44 44 /* if device autodetection is needed: */
+2
drivers/i2c/busses/Kconfig
··· 79 79 config I2C_I801 80 80 tristate "Intel 82801 (ICH/PCH)" 81 81 depends on PCI 82 + select CHECK_SIGNATURE if X86 && DMI 82 83 help 83 84 If you say yes to this option, support will be included for the Intel 84 85 801 family of mainboard I2C interfaces. Specifically, the following ··· 102 101 6 Series (PCH) 103 102 Patsburg (PCH) 104 103 DH89xxCC (PCH) 104 + Panther Point (PCH) 105 105 106 106 This driver can also be built as a module. If so, the module 107 107 will be called i2c-i801.
+38 -23
drivers/i2c/busses/i2c-i801.c
··· 50 50 Patsburg (PCH) IDF 0x1d71 32 hard yes yes yes 51 51 Patsburg (PCH) IDF 0x1d72 32 hard yes yes yes 52 52 DH89xxCC (PCH) 0x2330 32 hard yes yes yes 53 + Panther Point (PCH) 0x1e22 32 hard yes yes yes 53 54 54 55 Features supported by this driver: 55 56 Software PEC no ··· 138 137 /* Older devices have their ID defined in <linux/pci_ids.h> */ 139 138 #define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 140 139 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 141 - #define PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS 0x1e22 142 140 /* Patsburg also has three 'Integrated Device Function' SMBus controllers */ 143 141 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0 0x1d70 144 142 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1 0x1d71 145 143 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2 0x1d72 144 + #define PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS 0x1e22 146 145 #define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 147 146 #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 148 147 ··· 160 159 #define FEATURE_BLOCK_BUFFER (1 << 1) 161 160 #define FEATURE_BLOCK_PROC (1 << 2) 162 161 #define FEATURE_I2C_BLOCK_READ (1 << 3) 162 + /* Not really a feature, but it's convenient to handle it as such */ 163 + #define FEATURE_IDF (1 << 15) 163 164 164 165 static const char *i801_feature_names[] = { 165 166 "SMBus PEC", ··· 632 629 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1) }, 633 630 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2) }, 634 631 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) }, 632 + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS) }, 635 633 { 0, } 636 634 }; 637 635 638 636 MODULE_DEVICE_TABLE(pci, i801_ids); 639 637 640 - #if defined CONFIG_INPUT_APANEL || defined CONFIG_INPUT_APANEL_MODULE 638 + #if defined CONFIG_X86 && defined CONFIG_DMI 641 639 static unsigned char apanel_addr; 642 640 643 641 /* Scan the system ROM for the signature "FJKEYINF" */ ··· 668 664 } 669 665 iounmap(bios); 670 666 } 671 - #else 672 - static void __init input_apanel_init(void) {} 673 - #endif 674 667 675 - #if defined CONFIG_SENSORS_FSCHMD || defined CONFIG_SENSORS_FSCHMD_MODULE 676 668 struct dmi_onboard_device_info { 677 669 const char *name; 678 670 u8 type; ··· 734 734 dmi_check_onboard_device(type, name, adap); 735 735 } 736 736 } 737 - #endif 737 + 738 + /* Register optional slaves */ 739 + static void __devinit i801_probe_optional_slaves(struct i801_priv *priv) 740 + { 741 + /* Only register slaves on main SMBus channel */ 742 + if (priv->features & FEATURE_IDF) 743 + return; 744 + 745 + if (apanel_addr) { 746 + struct i2c_board_info info; 747 + 748 + memset(&info, 0, sizeof(struct i2c_board_info)); 749 + info.addr = apanel_addr; 750 + strlcpy(info.type, "fujitsu_apanel", I2C_NAME_SIZE); 751 + i2c_new_device(&priv->adapter, &info); 752 + } 753 + 754 + if (dmi_name_in_vendors("FUJITSU")) 755 + dmi_walk(dmi_check_onboard_devices, &priv->adapter); 756 + } 757 + #else 758 + static void __init input_apanel_init(void) {} 759 + static void __devinit i801_probe_optional_slaves(struct i801_priv *priv) {} 760 + #endif /* CONFIG_X86 && CONFIG_DMI */ 738 761 739 762 static int __devinit i801_probe(struct pci_dev *dev, 740 763 const struct pci_device_id *id) ··· 777 754 778 755 priv->pci_dev = dev; 779 756 switch (dev->device) { 757 + case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0: 758 + case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1: 759 + case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2: 760 + priv->features |= FEATURE_IDF; 761 + /* fall through */ 780 762 default: 781 763 priv->features |= FEATURE_I2C_BLOCK_READ; 782 764 /* fall through */ ··· 867 839 goto exit_release; 868 840 } 869 841 870 - /* Register optional slaves */ 871 - #if defined CONFIG_INPUT_APANEL || defined CONFIG_INPUT_APANEL_MODULE 872 - if (apanel_addr) { 873 - struct i2c_board_info info; 874 - 875 - memset(&info, 0, sizeof(struct i2c_board_info)); 876 - info.addr = apanel_addr; 877 - strlcpy(info.type, "fujitsu_apanel", I2C_NAME_SIZE); 878 - i2c_new_device(&priv->adapter, &info); 879 - } 880 - #endif 881 - #if defined CONFIG_SENSORS_FSCHMD || defined CONFIG_SENSORS_FSCHMD_MODULE 882 - if (dmi_name_in_vendors("FUJITSU")) 883 - dmi_walk(dmi_check_onboard_devices, &priv->adapter); 884 - #endif 842 + i801_probe_optional_slaves(priv); 885 843 886 844 pci_set_drvdata(dev, priv); 887 845 return 0; ··· 927 913 928 914 static int __init i2c_i801_init(void) 929 915 { 930 - input_apanel_init(); 916 + if (dmi_name_in_vendors("FUJITSU")) 917 + input_apanel_init(); 931 918 return pci_register_driver(&i801_driver); 932 919 } 933 920
+5 -5
drivers/i2c/busses/i2c-parport-light.c
··· 2 2 * i2c-parport-light.c I2C bus over parallel port * 3 3 * ------------------------------------------------------------------------ * 4 4 Copyright (C) 2003-2010 Jean Delvare <khali@linux-fr.org> 5 - 5 + 6 6 Based on older i2c-velleman.c driver 7 7 Copyright (C) 1995-2000 Simon G. Vogl 8 8 With some changes from: 9 9 Frodo Looijaard <frodol@dds.nl> 10 10 Kyösti Mälkki <kmalkki@cc.hut.fi> 11 - 11 + 12 12 This program is free software; you can redistribute it and/or modify 13 13 it under the terms of the GNU General Public License as published by 14 14 the Free Software Foundation; either version 2 of the License, or ··· 114 114 .getscl = parport_getscl, 115 115 .udelay = 50, 116 116 .timeout = HZ, 117 - }; 117 + }; 118 118 119 119 /* ----- Driver registration ---------------------------------------------- */ 120 120 ··· 132 132 static struct i2c_client *ara; 133 133 static struct lineop parport_ctrl_irq = { 134 134 .val = (1 << 4), 135 - .port = CTRL, 135 + .port = PORT_CTRL, 136 136 }; 137 137 138 138 static int __devinit i2c_parport_probe(struct platform_device *pdev) ··· 245 245 if (irq != 0) 246 246 pr_info(DRVNAME ": using irq %d\n", irq); 247 247 248 - if (!adapter_parm[type].getscl.val) 248 + if (!adapter_parm[type].getscl.val) 249 249 parport_algo_data.getscl = NULL; 250 250 251 251 /* Sets global pdev as a side effect */
+15 -15
drivers/i2c/busses/i2c-parport.c
··· 2 2 * i2c-parport.c I2C bus over parallel port * 3 3 * ------------------------------------------------------------------------ * 4 4 Copyright (C) 2003-2011 Jean Delvare <khali@linux-fr.org> 5 - 5 + 6 6 Based on older i2c-philips-par.c driver 7 7 Copyright (C) 1995-2000 Simon G. Vogl 8 8 With some changes from: 9 9 Frodo Looijaard <frodol@dds.nl> 10 10 Kyösti Mälkki <kmalkki@cc.hut.fi> 11 - 11 + 12 12 This program is free software; you can redistribute it and/or modify 13 13 it under the terms of the GNU General Public License as published by 14 14 the Free Software Foundation; either version 2 of the License, or ··· 78 78 return parport_read_control(p); 79 79 } 80 80 81 - static void (*port_write[])(struct parport *, unsigned char) = { 81 + static void (* const port_write[])(struct parport *, unsigned char) = { 82 82 port_write_data, 83 83 NULL, 84 84 port_write_control, 85 85 }; 86 86 87 - static unsigned char (*port_read[])(struct parport *) = { 87 + static unsigned char (* const port_read[])(struct parport *) = { 88 88 port_read_data, 89 89 port_read_status, 90 90 port_read_control, ··· 147 147 .getscl = parport_getscl, 148 148 .udelay = 10, /* ~50 kbps */ 149 149 .timeout = HZ, 150 - }; 150 + }; 151 151 152 152 /* ----- I2c and parallel port call-back functions and structures --------- */ 153 153 ··· 164 164 "SMBus alert received but no ARA client!\n"); 165 165 } 166 166 167 - static void i2c_parport_attach (struct parport *port) 167 + static void i2c_parport_attach(struct parport *port) 168 168 { 169 169 struct i2c_par *adapter; 170 - 170 + 171 171 adapter = kzalloc(sizeof(struct i2c_par), GFP_KERNEL); 172 172 if (adapter == NULL) { 173 173 printk(KERN_ERR "i2c-parport: Failed to kzalloc\n"); ··· 180 180 NULL, NULL, i2c_parport_irq, PARPORT_FLAG_EXCL, adapter); 181 181 if (!adapter->pdev) { 182 182 printk(KERN_ERR "i2c-parport: Unable to register with parport\n"); 183 - goto ERROR0; 183 + goto err_free; 184 184 } 185 185 186 186 /* Fill the rest of the structure */ ··· 200 200 201 201 if (parport_claim_or_block(adapter->pdev) < 0) { 202 202 printk(KERN_ERR "i2c-parport: Could not claim parallel port\n"); 203 - goto ERROR1; 203 + goto err_unregister; 204 204 } 205 205 206 206 /* Reset hardware to a sane state (SCL and SDA high) */ ··· 215 215 216 216 if (i2c_bit_add_bus(&adapter->adapter) < 0) { 217 217 printk(KERN_ERR "i2c-parport: Unable to register with I2C\n"); 218 - goto ERROR1; 218 + goto err_unregister; 219 219 } 220 220 221 221 /* Setup SMBus alert if supported */ ··· 234 234 mutex_lock(&adapter_list_lock); 235 235 list_add_tail(&adapter->node, &adapter_list); 236 236 mutex_unlock(&adapter_list_lock); 237 - return; 237 + return; 238 238 239 - ERROR1: 239 + err_unregister: 240 240 parport_release(adapter->pdev); 241 241 parport_unregister_device(adapter->pdev); 242 - ERROR0: 242 + err_free: 243 243 kfree(adapter); 244 244 } 245 245 246 - static void i2c_parport_detach (struct parport *port) 246 + static void i2c_parport_detach(struct parport *port) 247 247 { 248 248 struct i2c_par *adapter, *_n; 249 249 ··· 260 260 /* Un-init if needed (power off...) */ 261 261 if (adapter_parm[type].init.val) 262 262 line_set(port, 0, &adapter_parm[type].init); 263 - 263 + 264 264 parport_release(adapter->pdev); 265 265 parport_unregister_device(adapter->pdev); 266 266 list_del(&adapter->node);
+35 -39
drivers/i2c/busses/i2c-parport.h
··· 2 2 * i2c-parport.h I2C bus over parallel port * 3 3 * ------------------------------------------------------------------------ * 4 4 Copyright (C) 2003-2010 Jean Delvare <khali@linux-fr.org> 5 - 5 + 6 6 This program is free software; you can redistribute it and/or modify 7 7 it under the terms of the GNU General Public License as published by 8 8 the Free Software Foundation; either version 2 of the License, or ··· 18 18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 19 * ------------------------------------------------------------------------ */ 20 20 21 - #ifdef DATA 22 - #undef DATA 23 - #endif 24 - 25 - #define DATA 0 26 - #define STAT 1 27 - #define CTRL 2 21 + #define PORT_DATA 0 22 + #define PORT_STAT 1 23 + #define PORT_CTRL 2 28 24 29 25 struct lineop { 30 26 u8 val; ··· 37 41 unsigned int smbus_alert:1; 38 42 }; 39 43 40 - static struct adapter_parm adapter_parm[] = { 44 + static const struct adapter_parm adapter_parm[] = { 41 45 /* type 0: Philips adapter */ 42 46 { 43 - .setsda = { 0x80, DATA, 1 }, 44 - .setscl = { 0x08, CTRL, 0 }, 45 - .getsda = { 0x80, STAT, 0 }, 46 - .getscl = { 0x08, STAT, 0 }, 47 + .setsda = { 0x80, PORT_DATA, 1 }, 48 + .setscl = { 0x08, PORT_CTRL, 0 }, 49 + .getsda = { 0x80, PORT_STAT, 0 }, 50 + .getscl = { 0x08, PORT_STAT, 0 }, 47 51 }, 48 52 /* type 1: home brew teletext adapter */ 49 53 { 50 - .setsda = { 0x02, DATA, 0 }, 51 - .setscl = { 0x01, DATA, 0 }, 52 - .getsda = { 0x80, STAT, 1 }, 54 + .setsda = { 0x02, PORT_DATA, 0 }, 55 + .setscl = { 0x01, PORT_DATA, 0 }, 56 + .getsda = { 0x80, PORT_STAT, 1 }, 53 57 }, 54 58 /* type 2: Velleman K8000 adapter */ 55 59 { 56 - .setsda = { 0x02, CTRL, 1 }, 57 - .setscl = { 0x08, CTRL, 1 }, 58 - .getsda = { 0x10, STAT, 0 }, 60 + .setsda = { 0x02, PORT_CTRL, 1 }, 61 + .setscl = { 0x08, PORT_CTRL, 1 }, 62 + .getsda = { 0x10, PORT_STAT, 0 }, 59 63 }, 60 64 /* type 3: ELV adapter */ 61 65 { 62 - .setsda = { 0x02, DATA, 1 }, 63 - .setscl = { 0x01, DATA, 1 }, 64 - .getsda = { 0x40, STAT, 1 }, 65 - .getscl = { 0x08, STAT, 1 }, 66 + .setsda = { 0x02, PORT_DATA, 1 }, 67 + .setscl = { 0x01, PORT_DATA, 1 }, 68 + .getsda = { 0x40, PORT_STAT, 1 }, 69 + .getscl = { 0x08, PORT_STAT, 1 }, 66 70 }, 67 71 /* type 4: ADM1032 evaluation board */ 68 72 { 69 - .setsda = { 0x02, DATA, 1 }, 70 - .setscl = { 0x01, DATA, 1 }, 71 - .getsda = { 0x10, STAT, 1 }, 72 - .init = { 0xf0, DATA, 0 }, 73 + .setsda = { 0x02, PORT_DATA, 1 }, 74 + .setscl = { 0x01, PORT_DATA, 1 }, 75 + .getsda = { 0x10, PORT_STAT, 1 }, 76 + .init = { 0xf0, PORT_DATA, 0 }, 73 77 .smbus_alert = 1, 74 78 }, 75 79 /* type 5: ADM1025, ADM1030 and ADM1031 evaluation boards */ 76 80 { 77 - .setsda = { 0x02, DATA, 1 }, 78 - .setscl = { 0x01, DATA, 1 }, 79 - .getsda = { 0x10, STAT, 1 }, 81 + .setsda = { 0x02, PORT_DATA, 1 }, 82 + .setscl = { 0x01, PORT_DATA, 1 }, 83 + .getsda = { 0x10, PORT_STAT, 1 }, 80 84 }, 81 85 /* type 6: Barco LPT->DVI (K5800236) adapter */ 82 86 { 83 - .setsda = { 0x02, DATA, 1 }, 84 - .setscl = { 0x01, DATA, 1 }, 85 - .getsda = { 0x20, STAT, 0 }, 86 - .getscl = { 0x40, STAT, 0 }, 87 - .init = { 0xfc, DATA, 0 }, 87 + .setsda = { 0x02, PORT_DATA, 1 }, 88 + .setscl = { 0x01, PORT_DATA, 1 }, 89 + .getsda = { 0x20, PORT_STAT, 0 }, 90 + .getscl = { 0x40, PORT_STAT, 0 }, 91 + .init = { 0xfc, PORT_DATA, 0 }, 88 92 }, 89 93 /* type 7: One For All JP1 parallel port adapter */ 90 94 { 91 - .setsda = { 0x01, DATA, 0 }, 92 - .setscl = { 0x02, DATA, 0 }, 93 - .getsda = { 0x80, STAT, 1 }, 94 - .init = { 0x04, DATA, 1 }, 95 + .setsda = { 0x01, PORT_DATA, 0 }, 96 + .setscl = { 0x02, PORT_DATA, 0 }, 97 + .getsda = { 0x80, PORT_STAT, 1 }, 98 + .init = { 0x04, PORT_DATA, 1 }, 95 99 }, 96 100 }; 97 101