Commit 37d8cb5478651b27779b9a80d024c614c452eae3
Exists in
master
and in
20 other branches
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
Documentation/i2c/writing-clients
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 |