Commit 37d8cb5478651b27779b9a80d024c614c452eae3

Authored by Linus Torvalds

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

Showing 7 changed files Side-by-side Diff

Documentation/i2c/busses/i2c-i801
... ... @@ -19,6 +19,7 @@
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
Documentation/i2c/writing-clients
... ... @@ -38,7 +38,7 @@
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: */
drivers/i2c/busses/Kconfig
... ... @@ -79,6 +79,7 @@
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
... ... @@ -101,6 +102,7 @@
101 102 6 Series (PCH)
102 103 Patsburg (PCH)
103 104 DH89xxCC (PCH)
  105 + Panther Point (PCH)
104 106  
105 107 This driver can also be built as a module. If so, the module
106 108 will be called i2c-i801.
drivers/i2c/busses/i2c-i801.c
... ... @@ -50,6 +50,7 @@
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
56 57  
... ... @@ -137,11 +138,11 @@
137 138 /* Older devices have their ID defined in <linux/pci_ids.h> */
138 139 #define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22
139 140 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22
140   -#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS 0x1e22
141 141 /* Patsburg also has three 'Integrated Device Function' SMBus controllers */
142 142 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0 0x1d70
143 143 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1 0x1d71
144 144 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2 0x1d72
  145 +#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS 0x1e22
145 146 #define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330
146 147 #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30
147 148  
... ... @@ -159,6 +160,8 @@
159 160 #define FEATURE_BLOCK_BUFFER (1 << 1)
160 161 #define FEATURE_BLOCK_PROC (1 << 2)
161 162 #define FEATURE_I2C_BLOCK_READ (1 << 3)
  163 +/* Not really a feature, but it's convenient to handle it as such */
  164 +#define FEATURE_IDF (1 << 15)
162 165  
163 166 static const char *i801_feature_names[] = {
164 167 "SMBus PEC",
165 168  
... ... @@ -629,12 +632,13 @@
629 632 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1) },
630 633 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2) },
631 634 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) },
  635 + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS) },
632 636 { 0, }
633 637 };
634 638  
635 639 MODULE_DEVICE_TABLE(pci, i801_ids);
636 640  
637   -#if defined CONFIG_INPUT_APANEL || defined CONFIG_INPUT_APANEL_MODULE
  641 +#if defined CONFIG_X86 && defined CONFIG_DMI
638 642 static unsigned char apanel_addr;
639 643  
640 644 /* Scan the system ROM for the signature "FJKEYINF" */
641 645  
... ... @@ -664,11 +668,7 @@
664 668 }
665 669 iounmap(bios);
666 670 }
667   -#else
668   -static void __init input_apanel_init(void) {}
669   -#endif
670 671  
671   -#if defined CONFIG_SENSORS_FSCHMD || defined CONFIG_SENSORS_FSCHMD_MODULE
672 672 struct dmi_onboard_device_info {
673 673 const char *name;
674 674 u8 type;
675 675  
... ... @@ -734,8 +734,31 @@
734 734 dmi_check_onboard_device(type, name, adap);
735 735 }
736 736 }
737   -#endif
738 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 */
  761 +
739 762 static int __devinit i801_probe(struct pci_dev *dev,
740 763 const struct pci_device_id *id)
741 764 {
... ... @@ -754,6 +777,11 @@
754 777  
755 778 priv->pci_dev = dev;
756 779 switch (dev->device) {
  780 + case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0:
  781 + case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1:
  782 + case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2:
  783 + priv->features |= FEATURE_IDF;
  784 + /* fall through */
757 785 default:
758 786 priv->features |= FEATURE_I2C_BLOCK_READ;
759 787 /* fall through */
760 788  
... ... @@ -839,22 +867,8 @@
839 867 goto exit_release;
840 868 }
841 869  
842   - /* Register optional slaves */
843   -#if defined CONFIG_INPUT_APANEL || defined CONFIG_INPUT_APANEL_MODULE
844   - if (apanel_addr) {
845   - struct i2c_board_info info;
  870 + i801_probe_optional_slaves(priv);
846 871  
847   - memset(&info, 0, sizeof(struct i2c_board_info));
848   - info.addr = apanel_addr;
849   - strlcpy(info.type, "fujitsu_apanel", I2C_NAME_SIZE);
850   - i2c_new_device(&priv->adapter, &info);
851   - }
852   -#endif
853   -#if defined CONFIG_SENSORS_FSCHMD || defined CONFIG_SENSORS_FSCHMD_MODULE
854   - if (dmi_name_in_vendors("FUJITSU"))
855   - dmi_walk(dmi_check_onboard_devices, &priv->adapter);
856   -#endif
857   -
858 872 pci_set_drvdata(dev, priv);
859 873 return 0;
860 874  
... ... @@ -913,7 +927,8 @@
913 927  
914 928 static int __init i2c_i801_init(void)
915 929 {
916   - input_apanel_init();
  930 + if (dmi_name_in_vendors("FUJITSU"))
  931 + input_apanel_init();
917 932 return pci_register_driver(&i801_driver);
918 933 }
919 934  
drivers/i2c/busses/i2c-parport-light.c
... ... @@ -2,13 +2,13 @@
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,7 +114,7 @@
114 114 .getscl = parport_getscl,
115 115 .udelay = 50,
116 116 .timeout = HZ,
117   -};
  117 +};
118 118  
119 119 /* ----- Driver registration ---------------------------------------------- */
120 120  
... ... @@ -132,7 +132,7 @@
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,7 +245,7 @@
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 */
drivers/i2c/busses/i2c-parport.c
... ... @@ -2,13 +2,13 @@
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
15 15  
... ... @@ -78,13 +78,13 @@
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,7 +147,7 @@
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  
154 154  
... ... @@ -164,10 +164,10 @@
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,7 +180,7 @@
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,7 +200,7 @@
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,7 +215,7 @@
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 */
222 222  
223 223  
224 224  
... ... @@ -234,16 +234,16 @@
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,7 +260,7 @@
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);
drivers/i2c/busses/i2c-parport.h
... ... @@ -2,7 +2,7 @@
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
9 9  
... ... @@ -18,14 +18,10 @@
18 18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 19 * ------------------------------------------------------------------------ */
20 20  
21   -#ifdef DATA
22   -#undef DATA
23   -#endif
  21 +#define PORT_DATA 0
  22 +#define PORT_STAT 1
  23 +#define PORT_CTRL 2
24 24  
25   -#define DATA 0
26   -#define STAT 1
27   -#define CTRL 2
28   -
29 25 struct lineop {
30 26 u8 val;
31 27 u8 port;
32 28  
33 29  
34 30  
35 31  
36 32  
37 33  
38 34  
39 35  
... ... @@ -41,61 +37,61 @@
41 37 unsigned int smbus_alert:1;
42 38 };
43 39  
44   -static struct adapter_parm adapter_parm[] = {
  40 +static const struct adapter_parm adapter_parm[] = {
45 41 /* type 0: Philips adapter */
46 42 {
47   - .setsda = { 0x80, DATA, 1 },
48   - .setscl = { 0x08, CTRL, 0 },
49   - .getsda = { 0x80, STAT, 0 },
50   - .getscl = { 0x08, STAT, 0 },
  43 + .setsda = { 0x80, PORT_DATA, 1 },
  44 + .setscl = { 0x08, PORT_CTRL, 0 },
  45 + .getsda = { 0x80, PORT_STAT, 0 },
  46 + .getscl = { 0x08, PORT_STAT, 0 },
51 47 },
52 48 /* type 1: home brew teletext adapter */
53 49 {
54   - .setsda = { 0x02, DATA, 0 },
55   - .setscl = { 0x01, DATA, 0 },
56   - .getsda = { 0x80, STAT, 1 },
  50 + .setsda = { 0x02, PORT_DATA, 0 },
  51 + .setscl = { 0x01, PORT_DATA, 0 },
  52 + .getsda = { 0x80, PORT_STAT, 1 },
57 53 },
58 54 /* type 2: Velleman K8000 adapter */
59 55 {
60   - .setsda = { 0x02, CTRL, 1 },
61   - .setscl = { 0x08, CTRL, 1 },
62   - .getsda = { 0x10, STAT, 0 },
  56 + .setsda = { 0x02, PORT_CTRL, 1 },
  57 + .setscl = { 0x08, PORT_CTRL, 1 },
  58 + .getsda = { 0x10, PORT_STAT, 0 },
63 59 },
64 60 /* type 3: ELV adapter */
65 61 {
66   - .setsda = { 0x02, DATA, 1 },
67   - .setscl = { 0x01, DATA, 1 },
68   - .getsda = { 0x40, STAT, 1 },
69   - .getscl = { 0x08, STAT, 1 },
  62 + .setsda = { 0x02, PORT_DATA, 1 },
  63 + .setscl = { 0x01, PORT_DATA, 1 },
  64 + .getsda = { 0x40, PORT_STAT, 1 },
  65 + .getscl = { 0x08, PORT_STAT, 1 },
70 66 },
71 67 /* type 4: ADM1032 evaluation board */
72 68 {
73   - .setsda = { 0x02, DATA, 1 },
74   - .setscl = { 0x01, DATA, 1 },
75   - .getsda = { 0x10, STAT, 1 },
76   - .init = { 0xf0, DATA, 0 },
  69 + .setsda = { 0x02, PORT_DATA, 1 },
  70 + .setscl = { 0x01, PORT_DATA, 1 },
  71 + .getsda = { 0x10, PORT_STAT, 1 },
  72 + .init = { 0xf0, PORT_DATA, 0 },
77 73 .smbus_alert = 1,
78 74 },
79 75 /* type 5: ADM1025, ADM1030 and ADM1031 evaluation boards */
80 76 {
81   - .setsda = { 0x02, DATA, 1 },
82   - .setscl = { 0x01, DATA, 1 },
83   - .getsda = { 0x10, STAT, 1 },
  77 + .setsda = { 0x02, PORT_DATA, 1 },
  78 + .setscl = { 0x01, PORT_DATA, 1 },
  79 + .getsda = { 0x10, PORT_STAT, 1 },
84 80 },
85 81 /* type 6: Barco LPT->DVI (K5800236) adapter */
86 82 {
87   - .setsda = { 0x02, DATA, 1 },
88   - .setscl = { 0x01, DATA, 1 },
89   - .getsda = { 0x20, STAT, 0 },
90   - .getscl = { 0x40, STAT, 0 },
91   - .init = { 0xfc, DATA, 0 },
  83 + .setsda = { 0x02, PORT_DATA, 1 },
  84 + .setscl = { 0x01, PORT_DATA, 1 },
  85 + .getsda = { 0x20, PORT_STAT, 0 },
  86 + .getscl = { 0x40, PORT_STAT, 0 },
  87 + .init = { 0xfc, PORT_DATA, 0 },
92 88 },
93 89 /* type 7: One For All JP1 parallel port adapter */
94 90 {
95   - .setsda = { 0x01, DATA, 0 },
96   - .setscl = { 0x02, DATA, 0 },
97   - .getsda = { 0x80, STAT, 1 },
98   - .init = { 0x04, DATA, 1 },
  91 + .setsda = { 0x01, PORT_DATA, 0 },
  92 + .setscl = { 0x02, PORT_DATA, 0 },
  93 + .getsda = { 0x80, PORT_STAT, 1 },
  94 + .init = { 0x04, PORT_DATA, 1 },
99 95 },
100 96 };
101 97