- delete bogous drivers/media/video/tvmixer.c patch chunk from usb-2.5
[opensuse:kernel-source.git] / patches.drivers / usb-2.5
1 diff -purN linux-2.5/CREDITS usb-2.5/CREDITS
2 --- linux-2.5/CREDITS   2003-09-30 10:03:37.000000000 +0000
3 +++ usb-2.5/CREDITS     2003-10-08 20:53:47.000000000 +0000
4 @@ -2669,6 +2669,13 @@ S: Kasarmikatu 11 A4
5  S: 70110 Kuopio
6  S: Finland
7  
8 +N: Luca Risolia
9 +E: luca_ing@libero.it
10 +D: V4L driver for W996[87]CF JPEG USB Dual Mode Camera Chip
11 +S: Via Libertà 41/a
12 +S: Osio Sotto, 24046, Bergamo
13 +S: Italy
14 +
15  N: William E. Roadcap
16  E: roadcapw@cfw.com
17  W: http://www.cfw.com/~roadcapw
18 @@ -3569,4 +3576,4 @@ S: France
19  # alphabetically. Leonard used to be very proud of being the 
20  # last entry, and he'll get positively pissed if he can't even
21  # be second-to-last.  (and this file really _is_ supposed to be
22 -# in alphabetic order) 
23 +# in alphabetic order)
24 diff -purN linux-2.5/Documentation/devices.txt usb-2.5/Documentation/devices.txt
25 --- linux-2.5/Documentation/devices.txt 2003-03-27 00:34:38.000000000 +0000
26 +++ usb-2.5/Documentation/devices.txt   2003-10-08 17:57:24.000000000 +0000
27 @@ -2165,16 +2165,27 @@ Your cooperation is appreciated.
28                   0 = /dev/usb/lp0      First USB printer
29                     ...
30                  15 = /dev/usb/lp15     16th USB printer
31 -                16 = /dev/usb/mouse0   First USB mouse
32 -                   ...
33 -                31 = /dev/usb/mouse15  16th USB mouse
34 -                32 = /dev/usb/ez0      First USB firmware loader
35 -                   ...
36 -                47 = /dev/usb/ez15     16th USB firmware loader
37 +                32 = /dev/usb/mdc800   MDC800 USB camera
38                  48 = /dev/usb/scanner0 First USB scanner
39                     ...
40                  63 = /dev/usb/scanner15 16th USB scanner
41                  64 = /dev/usb/rio500   Diamond Rio 500
42 +                96 = /dev/usb/hiddev0  1st USB HID device
43 +                   ...
44 +               111 = /dev/usb/hiddev15 16th USB HID device
45 +               112 = /dev/usb/auer0    1st auerswald ISDN device
46 +                   ...
47 +               127 = /dev/usb/auer15   16th auerswald ISDN device
48 +               128 = /dev/usb/brlvgr0  First Braille Voyager device
49 +                   ...
50 +               131 = /dev/usb/brlvgr3  Fourth Braille Voyager device
51 +               144 = /dev/usb/lcd      USB LCD device
52 +               160 = /dev/usb/legousbtower0    1st USB Legotower device
53 +                   ...
54 +               175 = /dev/usb/legousbtower15   16th USB Legotower device
55 +               240 = /dev/usb/dabusb0  First daubusb device
56 +                   ...
57 +               243 = /dev/usb/dabusb3  Fourth dabusb device
58  
59  181 char       Conrad Electronic parallel port radio clocks
60                   0 = /dev/pcfclock0    First Conrad radio clock
61 diff -purN linux-2.5/Documentation/i2c/porting-clients usb-2.5/Documentation/i2c/porting-clients
62 --- linux-2.5/Documentation/i2c/porting-clients 1970-01-01 00:00:00.000000000 +0000
63 +++ usb-2.5/Documentation/i2c/porting-clients   2003-10-04 18:05:51.000000000 +0000
64 @@ -0,0 +1,121 @@
65 +Revision 3, 2003-10-04
66 +Jean Delvare <khali@linux-fr.org>
67 +Greg KH <greg@kroah.com>
68 +
69 +This is a guide on how to convert I2C chip drivers from Linux 2.4 to
70 +Linux 2.6. I have been using existing drivers (lm75, lm78) as examples.
71 +Then I converted a driver myself (lm83) and updated this document.
72 +
73 +There are two sets of points below. The first set concerns technical
74 +changes. The second set concerns coding policy. Both are mandatory.
75 +
76 +Although reading this guide will help you porting drivers, I suggest
77 +you keep an eye on an already ported driver while porting your own
78 +driver. This will help you a lot understanding what this guide
79 +exactly means. Choose the chip driver that is the more similar to
80 +yours for best results.
81 +
82 +Technical changes:
83 +
84 +* [Includes] Get rid of "version.h". Replace <linux/i2c-proc.h> with
85 +  <linux/i2c-sensor.h>. Includes typically look like that:
86 +  #include <linux/module.h>
87 +  #include <linux/init.h>
88 +  #include <linux/slab.h>
89 +  #include <linux/i2c.h>
90 +  #include <linux/i2c-sensor.h>
91 +  #include <linux/i2c-vid.h>     /* if you need VRM support */
92 +  #include <asm/io.h>            /* if you have I/O operations */
93 +  Some extra headers may be required for a given driver.
94 +
95 +* [Addresses] SENSORS_I2C_END becomes I2C_CLIENT_END, SENSORS_ISA_END
96 +  becomes I2C_CLIENT_ISA_END.
97 +
98 +* [Client data] Get rid of sysctl_id. Try using standard names for
99 +  register values (for example, temp_os becomes temp_max). You're
100 +  still relatively free here, but you *have* to follow the standard
101 +  names for sysfs files (see the Sysctl section below).
102 +
103 +* [Function prototypes] The detect functions loses its flags
104 +  parameter. Sysctl (e.g. lm75_temp) and miscellaneous (e.g.
105 +  swap_bytes) functions are off the list of prototypes. This
106 +  usually leaves five prototypes:
107 +  static int lm75_attach_adapter(struct i2c_adapter *adapter);
108 +  static int lm75_detect(struct i2c_adapter *adapter, int address,
109 +      int kind);
110 +  static void lm75_init_client(struct i2c_client *client);
111 +  static int lm75_detach_client(struct i2c_client *client);
112 +  static void lm75_update_client(struct i2c_client *client);
113 +
114 +* [Sysctl] All sysctl stuff is of course gone (defines, ctl_table
115 +  and functions). Instead, right after the static id definition
116 +  line, you have to define show and set functions for each sysfs
117 +  file. Only define set for writable values. Take a look at an
118 +  existing 2.6 driver for details (lm78 for example). Don't forget
119 +  to define the attributes for each file (this is that step that
120 +  links callback functions). Use the file names specified in
121 +  Documentation/i2c/sysfs-interface for the individual files. Also
122 +  convert the units these files read and write to the specified ones.
123 +  If you need to add a new type of file, please discuss it on the
124 +  sensors mailing list <sensors@stimpy.netroedge.com> by providing a
125 +  patch to the Documentation/i2c/sysfs-interface file.
126 +
127 +* [Attach] For I2C drivers, the attach function should make sure
128 +  that the adapter's class has I2C_ADAP_CLASS_SMBUS, using the
129 +  following construct:
130 +  if (!(adapter->class & I2C_ADAP_CLASS_SMBUS))
131 +          return 0;
132 +  ISA-only drivers of course don't need this.
133 +
134 +* [Detect] As mentioned earlier, the flags parameter is gone.
135 +  The type_name and client_name strings are replaced by a single
136 +  name string, which will be filled with a lowercase, short string
137 +  (typically the driver name, e.g. "lm75"). The errorN labels are
138 +  reduced to the number needed. If that number is 2 (i2c-only
139 +  drivers), it is advised that the labels are named exit and
140 +  exit_free. For i2c+isa drivers, labels should be named ERROR0,
141 +  ERROR1 and ERROR2. Don't forget to properly set err before
142 +  jumping to error labels. By the way, labels should be
143 +  left-aligned.
144 +  Use memset to fill the client and data area with 0x00.
145 +  Use i2c_set_clientdata to set the client data (as opposed to
146 +  a direct access to client->data).
147 +  Use strlcpy instead of strcpy to copy the client name.
148 +  Replace the sysctl directory registration by calls to
149 +  device_create_file. Move the driver initialization before any
150 +  sysfs file creation.
151 +
152 +* [Detach] Get rid of data, remove the call to
153 +  i2c_deregister_entry.
154 +
155 +* [Update] Don't access client->data directly, use
156 +  i2c_get_clientdata(client) instead.
157 +
158 +* [Interface] Init function should not print anything. Make sure
159 +  there is a MODULE_LICENSE() line.
160 +
161 +Coding policy:
162 +
163 +* [Copyright] Use (C), not (c), for copyright.
164 +
165 +* [Debug/log] Get rid of #ifdef DEBUG/#endif constructs whenever you
166 +  can. Calls to printk/pr_debug for debugging purposes are replaced
167 +  by calls to dev_dbg. Here is an example on how to call it (taken
168 +  from lm75_detect):
169 +  dev_dbg(&adapter->dev,
170 +          "lm75_detect called for an ISA bus adapter?!?\n");
171 +  Replace other printk calls with the dev_info, dev_err or dev_warn
172 +  function, as appropriate.
173 +
174 +* [Constants] Constants defines (registers, conversions, initial
175 +  values) should be aligned. This greatly improves readability.
176 +  Same goes for variables declarations. Alignments are achieved by the
177 +  means of tabs, not spaces. Remember that tabs are set to 8 in the
178 +  Linux kernel code.
179 +
180 +* [Structure definition] The name field should be standardized. All
181 +  lowercase and as simple as the driver name itself (e.g. "lm75").
182 +
183 +* [Layout] Avoid extra empty lines between comments and what they
184 +  comment. Respect the coding style (see Documentation/CodingStyle),
185 +  in particular when it comes to placing curly braces.
186 diff -purN linux-2.5/Documentation/i2c/sysfs-interface usb-2.5/Documentation/i2c/sysfs-interface
187 --- linux-2.5/Documentation/i2c/sysfs-interface 2003-09-23 16:14:19.000000000 +0000
188 +++ usb-2.5/Documentation/i2c/sysfs-interface   2003-11-16 19:57:41.000000000 +0000
189 @@ -68,9 +68,7 @@ curr_max[1-n] Current max value
190                 Fixed point XXXXX, divide by 1000 to get Amps.
191                 Read/Write.
192  
193 -curr_min[1-n]  Current min or hysteresis value.
194 -               Preferably a hysteresis value, reported as a absolute
195 -               current, NOT a delta from the max value.
196 +curr_min[1-n]  Current min value.
197                 Fixed point XXXXX, divide by 1000 to get Amps.
198                 Read/Write.
199  
200 @@ -144,25 +142,38 @@ sensor[1-3]       Sensor type selection.
201                 Integers 1,2,3, or thermistor Beta value (3435)
202                 Read/Write.
203  
204 -temp_max[1-3]  Temperature max value.
205 +temp_max[1-4]  Temperature max value.
206                 Fixed point value in form XXXXX and should be divided by
207                 1000 to get degrees Celsius.
208                 Read/Write value.
209  
210 -temp_min[1-3]  Temperature min or hysteresis value.
211 +temp_min[1-3]  Temperature min value.
212                 Fixed point value in form XXXXX and should be divided by
213 -               1000 to get degrees Celsius.  This is preferably a
214 -               hysteresis value, reported as a absolute temperature,
215 -               NOT a delta from the max value.
216 +               1000 to get degrees Celsius.
217                 Read/Write value.
218  
219 -temp_input[1-3] Temperature input value.
220 +temp_hyst[1-3] Temperature hysteresis value.
221 +               Fixed point value in form XXXXX and should be divided by
222 +               1000 to get degrees Celsius.  Must be reported as an
223 +               absolute temperature, NOT a delta from the max value.
224 +               Read/Write value.
225 +
226 +temp_input[1-4] Temperature input value.
227 +               Fixed point value in form XXXXX and should be divided by
228 +               1000 to get degrees Celsius.
229                 Read only value.
230  
231 +temp_crit      Temperature critical value, typically greater than all
232 +               temp_max values.
233 +               Fixed point value in form XXXXX and should be divided by
234 +               1000 to get degrees Celsius.
235 +               Common to all temperature channels.
236 +               Read/Write value.
237 +
238                 If there are multiple temperature sensors, temp_*1 is
239                 generally the sensor inside the chip itself, generally
240 -               reported as "motherboard temperature".  temp_*2 and
241 -               temp_*3 are generally sensors external to the chip
242 +               reported as "motherboard temperature".  temp_*2 to
243 +               temp_*4 are generally sensors external to the chip
244                 itself, for example the thermal diode inside the CPU or
245                 a thermistor nearby.
246  
247 diff -purN linux-2.5/Documentation/i2c/writing-clients usb-2.5/Documentation/i2c/writing-clients
248 --- linux-2.5/Documentation/i2c/writing-clients 2003-02-04 20:58:09.000000000 +0000
249 +++ usb-2.5/Documentation/i2c/writing-clients   2003-11-09 14:19:12.000000000 +0000
250 @@ -24,16 +24,14 @@ all clients from it. Remember, a driver 
251  routines, a client structure specific information like the actual I2C
252  address.
253  
254 -  struct i2c_driver foo_driver
255 -  {  
256 -    /* name           */  "Foo version 2.3 and later driver",
257 -    /* id             */  I2C_DRIVERID_FOO,
258 -    /* flags          */  I2C_DF_NOTIFY,
259 -    /* attach_adapter */  &foo_attach_adapter,
260 -    /* detach_client  */  &foo_detach_client,
261 -    /* command        */  &foo_command,   /* May be NULL */
262 -    /* inc_use        */  &foo_inc_use,   /* May be NULL */
263 -    /* dec_use        */  &foo_dec_use    /* May be NULL */
264 +  static struct i2c_driver foo_driver = {
265 +    .owner          = THIS_MODULE,
266 +    .name           = "Foo version 2.3 driver",
267 +    .id             = I2C_DRIVERID_FOO, /* usually from i2c-id.h */
268 +    .flags          = I2C_DF_NOTIFY,
269 +    .attach_adapter = &foo_attach_adapter,
270 +    .detach_client  = &foo_detach_client,
271 +    .command        = &foo_command /* may be NULL */
272    }
273   
274  The name can be chosen freely, and may be upto 40 characters long. Please
275 @@ -50,43 +48,8 @@ This is almost always what you want.
276  All other fields are for call-back functions which will be explained 
277  below.
278  
279 -
280 -Module usage count
281 -==================
282 -
283 -If your driver can also be compiled as a module, there are moments at 
284 -which the module can not be removed from memory. For example, when you
285 -are doing a lengthy transaction, or when you create a /proc directory,
286 -and some process has entered that directory (this last case is the
287 -main reason why these call-backs were introduced).
288 -
289 -To increase or decrease the module usage count, you can use the
290 -MOD_{INC,DEC}_USE_COUNT macros. They must be called from the module
291 -which needs to get its usage count changed; that is why each driver
292 -module has to implement its own callback.
293 -
294 -  void foo_inc_use (struct i2c_client *client)
295 -  {
296 -  #ifdef MODULE
297 -    MOD_INC_USE_COUNT;
298 -  #endif
299 -  }
300 -
301 -  void foo_dec_use (struct i2c_client *client)
302 -  {
303 -  #ifdef MODULE
304 -    MOD_DEC_USE_COUNT;
305 -  #endif
306 -  }
307 -
308 -Do not call these call-back functions directly; instead, use one of the
309 -following functions defined in i2c.h:
310 -  void i2c_inc_use_client(struct i2c_client *);
311 -  void i2c_dec_use_client(struct i2c_client *);
312 -
313 -You should *not* increase the module count just because a device is
314 -detected and a client created. This would make it impossible to remove
315 -an adapter driver! 
316 +There use to be two additional fields in this structure, inc_use et dec_use,
317 +for module usage count, but these fields were obsoleted and removed.
318  
319  
320  Extra client data
321 diff -purN linux-2.5/Documentation/usb/w9968cf.txt usb-2.5/Documentation/usb/w9968cf.txt
322 --- linux-2.5/Documentation/usb/w9968cf.txt     1970-01-01 00:00:00.000000000 +0000
323 +++ usb-2.5/Documentation/usb/w9968cf.txt       2003-10-04 10:02:10.000000000 +0000
324 @@ -0,0 +1,463 @@
325 +
326 +         W996[87]CF JPEG USB Dual Mode Camera Chip driver for Linux 2.6
327 +         ==============================================================
328 +
329 +                               - Documentation -
330 +
331 +
332 +Index
333 +=====
334 +1. Copyright
335 +2. License
336 +3. Overview
337 +4. Supported devices
338 +5. Kernel configuration and third-part module compilation
339 +6. Module loading
340 +7. Module paramaters
341 +8. Credits
342 +
343 +
344 +1. Copyright
345 +============
346 +Copyright (C) 2002 2003 by Luca Risolia <luca_ing@libero.it>
347 +
348 +
349 +2. License
350 +==========
351 +This program is free software; you can redistribute it and/or modify
352 +it under the terms of the GNU General Public License as published by
353 +the Free Software Foundation; either version 2 of the License, or
354 +(at your option) any later version.
355 +
356 +This program is distributed in the hope that it will be useful,
357 +but WITHOUT ANY WARRANTY; without even the implied warranty of
358 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
359 +GNU General Public License for more details.
360 +
361 +You should have received a copy of the GNU General Public License
362 +along with this program; if not, write to the Free Software
363 +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
364 +
365 +
366 +3. Overview
367 +===========
368 +This driver supports the video streaming capabilities of the devices mounting
369 +Winbond W9967CF and Winbond W9968CF JPEG USB Dual Mode Camera Chips, when they
370 +are being commanded by USB.
371 +
372 +The driver relies on the Video4Linux, USB and I2C core modules of the Linux
373 +kernel, version 2.6.0 or greater, and is not compatible in any way with
374 +previous versions. It has been designed to run properly on SMP systems
375 +as well. At the moment, an additional module, "ovcamchip", is mandatory; it
376 +provides support for some OmniVision CMOS sensors connected to the W996[87]CF
377 +chips.
378 +
379 +The driver is split into two modules: the basic one, "w9968cf", is needed for
380 +the supported devices to work; the second one, "w9968cf-vpp", is an optional
381 +module, which provides some useful video post-processing functions like video
382 +decoding, up-scaling and colour conversions. These routines can't be included
383 +into official kernels for performance purposes. Once the driver is installed,
384 +every time an application tries to open a recognized device, "w9968cf" checks
385 +the presence of the "w9968cf-vpp" module and loads it automatically by default.
386 +
387 +Up to 32 cameras can be handled at the same time. They can be connected and
388 +disconnected from the host many times without turning off the computer, if
389 +your system supports the hotplug facility.
390 +
391 +To change the default settings for each camera, many paramaters can be passed
392 +through command line when the module is loaded into memory.
393 +
394 +The latest and full featured version of the W996[87]CF driver can be found at:
395 +http://go.lamarinapunto.com/
396 +
397 +The "ovcamchip" module is part of the OV511 driver, version 2.25, which can be
398 +downloaded from internet:
399 +http://alpha.dyndns.org/ov511/
400 +To know how to patch, compile and load it, read the paragraphs below.
401 +
402 +
403 +4. Supported devices
404 +====================
405 +At the moment, known W996[87]CF based devices are:
406 +- Aroma Digi Pen ADG-5000 Refurbished
407 +- AVerTV USB
408 +- Creative Labs Video Blaster WebCam Go
409 +- Creative Labs Video Blaster WebCam Go Plus
410 +- Die Lebon LDC-D35A Digital Kamera
411 +- Ezonics EZ-802 EZMega Cam
412 +- OPCOM Digi Pen VGA Dual Mode Pen Camera
413 +
414 +If you know any other W996[87]CF based cameras, please contact me.
415 +
416 +The list above does NOT imply that all those devices work with this driver: up
417 +until now only webcams that have a CMOS sensor supported by the "ovcamchip"
418 +module work. 
419 +For a list of supported CMOS sensors, please visit the module author homepage:
420 +http://alpha.dyndns.org/ov511/
421 +
422 +Possible external microcontrollers of those webcams are not supported: this
423 +means that still images can't be downloaded from the device memory.
424 +
425 +Furthermore, it's worth to note that I was only able to run tests on my
426 +"Creative Labs Video Blaster WebCam Go". Donations of other models, for
427 +additional testing and full support, would be much appreciated.
428 +
429 +
430 +5. Kernel configuration and third-part module compilation
431 +=========================================================
432 +As noted above, kernel 2.6.0 is the minimum for this driver; for it to work
433 +properly, the driver needs kernel support for Video4Linux, USB and I2C, and a
434 +third-part module for the CMOS sensor.
435 +
436 +The following options of the kernel configuration file must be enabled and
437 +corresponding modules must be compiled:
438 +
439 +       # Multimedia devices
440 +       #
441 +       CONFIG_VIDEO_DEV=m
442 +
443 +       # I2C support
444 +       #
445 +       CONFIG_I2C=m
446 +
447 +The I2C core module can be compiled statically in the kernel as well.
448 +
449 +       # USB support
450 +       #
451 +       CONFIG_USB=m
452 +
453 +In addition, depending on the hardware being used, just one of the modules
454 +below is necessary:
455 +
456 +       # USB Host Controller Drivers
457 +       #
458 +       CONFIG_USB_EHCI_HCD=m
459 +       CONFIG_USB_UHCI_HCD=m
460 +       CONFIG_USB_OHCI_HCD=m
461 +
462 +Also, make sure "Enforce bandwidth allocation" is NOT enabled.
463 +
464 +       # USB Multimedia devices
465 +       #
466 +       CONFIG_USB_W9968CF=m
467 +
468 +The last module we need is "ovcamchip.o". To obtain it, you have to download
469 +the OV511 driver, version 2.25 - don't use other versions - which is available
470 +at http://alpha.dyndns.org/ov511/ . Then you have to download the latest 
471 +version of the full featured W996[87]CF driver, which contains a patch for the
472 +"ovcamchip" module; it is available at http://go.lamarinapunto.com .
473 +Once you have obtained the packages, decompress, patch and compile the 
474 +"ovcamchip" module. In other words:
475 +
476 +       [user@localhost home]$ tar xvzf w9968cf-x.x.tar.gz
477 +       [user@localhost home]$ tar xvjf ov511-2.25.tar.bz2
478 +       [user@localhost home]$ cd ov511-2.25
479 +       [user@localhost ov511-2.25]$ patch -p1 <                              \
480 +                                    /path/to/w9968cf-x.x/ov511-2.25.patch
481 +       [user@localhost ov511-2.25]$ make
482 +
483 +It's worth to note that the full featured version of the W996[87]CF driver
484 +can also be installed overwriting the one in the kernel; in this case, read the
485 +documentation included in the package.
486 +
487 +If everything went well, the W996[87]CF driver can be immediatly used (see next
488 +paragraph).
489 +
490 +
491 +6. Module loading
492 +=================
493 +To use the driver, it is necessary to load the "w9968cf" module into memory
494 +after every other module required.
495 +
496 +For example, loading can be done this way, as root:
497 +
498 +       [root@localhost home]# modprobe usbcore
499 +       [root@localhost home]# modprobe i2c-core
500 +       [root@localhost ov511-x.xx]# insmod ./ovcamchip.ko
501 +       [root@localhost home]# modprobe w9968cf
502 +
503 +At this point the devices should be recognized: "dmesg" can be used to analyze
504 +kernel messages:
505 +
506 +       [user@localhost home]$ dmesg
507 +
508 +There are a lot of parameters the module can use to change the default
509 +settings for each device. To list every possible parameter with a brief
510 +explanation about them and which syntax to use, it is recommended to run the
511 +"modinfo" command:
512 +
513 +       [root@locahost home]# modinfo w9968cf
514 +
515 +
516 +7. Module paramaters
517 +====================
518 +
519 +Module paramaters are listed below:
520 +-------------------------------------------------------------------------------
521 +Name:           vppmod_load
522 +Type:           int
523 +Syntax:         <0|1>
524 +Description:    Automatic 'w9968cf-vpp' module loading: 0 disabled, 1 enabled.
525 +                If enabled, every time an application attempts to open a
526 +                camera, 'insmod' searches for the video post-processing module
527 +                in the system and loads it automatically (if present).
528 +                The 'w9968cf-vpp' module adds extra image manipulation 
529 +                capabilities to the 'w9968cf' module,like software up-scaling,
530 +                colour conversions and video decoding.
531 +Default:        1
532 +-------------------------------------------------------------------------------
533 +Name:           simcams 
534 +Type:           int 
535 +Syntax:         <n> 
536 +Description:    Number of cameras allowed to stream simultaneously.
537 +                n may vary from 0 to 32.
538 +Default:        32
539 +-------------------------------------------------------------------------------
540 +Name:           video_nr
541 +Type:           int array (min = 0, max = 32)
542 +Syntax:         <-1|n[,...]> 
543 +Description:    Specify V4L minor mode number.
544 +                -1 = use next available
545 +                 n = use minor number n
546 +                You can specify 32 cameras this way.
547 +                For example:
548 +                video_nr=-1,2,-1 would assign minor number 2 to the second
549 +                recognized camera and use auto for the first one and for every
550 +                other camera.
551 +Default:        -1
552 +-------------------------------------------------------------------------------
553 +Name:           packet_size
554 +Type:           int array (min = 0, max = 32)
555 +Syntax:         <n[,...]> 
556 +Description:    Specify the maximum data payload size in bytes for alternate
557 +                settings, for each device. n is scaled between 63 and 1023.
558 +Default:        1023
559 +-------------------------------------------------------------------------------
560 +Name:           max_buffers
561 +Type:           int array (min = 0, max = 32)
562 +Syntax:         <n[,...]>
563 +Description:    Only for advanced users.
564 +                Specify the maximum number of video frame buffers to allocate
565 +                for each device, from 2 to 32.
566 +Default:        2
567 +-------------------------------------------------------------------------------
568 +Name:           double_buffer
569 +Type:           int array (min = 0, max = 32)
570 +Syntax:         <0|1[,...]> 
571 +Description:    Hardware double buffering: 0 disabled, 1 enabled.
572 +                It should be enabled if you want smooth video output: if you
573 +                obtain out of sync. video, disable it at all, or try to
574 +                decrease the 'clockdiv' module paramater value.
575 +Default:        1 for every device.
576 +-------------------------------------------------------------------------------
577 +Name:           clamping
578 +Type:           int array (min = 0, max = 32)
579 +Syntax:         <0|1[,...]> 
580 +Description:    Video data clamping: 0 disabled, 1 enabled.
581 +Default:        0 for every device.
582 +-------------------------------------------------------------------------------
583 +Name:           filter_type
584 +Type:           int array (min = 0, max = 32)
585 +Syntax:         <0|1|2[,...]> 
586 +Description:    Video filter type.
587 +                0 none, 1 (1-2-1) 3-tap filter, 2 (2-3-6-3-2) 5-tap filter.
588 +                The filter is used to reduce noise and aliasing artifacts
589 +                produced by the CCD or CMOS sensor.
590 +Default:        0 for every device.
591 +-------------------------------------------------------------------------------
592 +Name:           largeview
593 +Type:           int array (min = 0, max = 32)
594 +Syntax:         <0|1[,...]> 
595 +Description:    Large view: 0 disabled, 1 enabled.
596 +Default:        1 for every device.
597 +-------------------------------------------------------------------------------
598 +Name:           upscaling
599 +Type:           int array (min = 0, max = 32)
600 +Syntax:         <0|1[,...]> 
601 +Description:    Software scaling (for non-compressed video only):
602 +                0 disabled, 1 enabled.
603 +                Disable it if you have a slow CPU or you don't have enough
604 +                memory.
605 +Default:        0 for every device.
606 +Note:           If 'w9968cf-vpp' is not loaded, this paramater is set to 0.
607 +-------------------------------------------------------------------------------
608 +Name:           decompression
609 +Type:           int array (min = 0, max = 32)
610 +Syntax:         <0|1|2[,...]>
611 +Description:    Software video decompression:
612 +                0 = disables decompression
613 +                    (doesn't allow formats needing decompression).
614 +                1 = forces decompression
615 +                    (allows formats needing decompression only).
616 +                2 = allows any permitted formats.
617 +                Formats supporting (de)compressed video are YUV422P and
618 +                YUV420P/YUV420 in any resolutions where width and height are
619 +                multiples of 16.
620 +Default:        2 for every device.
621 +Note:           If 'w9968cf-vpp' is not loaded, forcing decompression is not
622 +                allowed; in this case this paramater is set to 2.
623 +-------------------------------------------------------------------------------
624 +Name:           force_palette
625 +Type:           int array (min = 0, max = 32)
626 +Syntax:         <0|9|10|13|15|8|7|1|6|3|4|5[,...]>
627 +Description:    Force picture palette.
628 +                In order:
629 +                 0 = Off - allows any of the following formats:
630 +                 9 = UYVY    16 bpp - Original video, compression disabled
631 +                10 = YUV420  12 bpp - Original video, compression enabled
632 +                13 = YUV422P 16 bpp - Original video, compression enabled
633 +                15 = YUV420P 12 bpp - Original video, compression enabled
634 +                 8 = YUVY    16 bpp - Software conversion from UYVY
635 +                 7 = YUV422  16 bpp - Software conversion from UYVY
636 +                 1 = GREY     8 bpp - Software conversion from UYVY
637 +                 6 = RGB555  16 bpp - Software conversion from UYVY
638 +                 3 = RGB565  16 bpp - Software conversion from UYVY
639 +                 4 = RGB24   24 bpp - Software conversion from UYVY
640 +                 5 = RGB32   32 bpp - Software conversion from UYVY
641 +                When not 0, this paramater will override 'decompression'.
642 +Default:        0 for every device. Initial palette is 9 (UYVY).
643 +Note:           If 'w9968cf-vpp' is not loaded, this paramater is set to 9.
644 +-------------------------------------------------------------------------------
645 +Name:           force_rgb
646 +Type:           int array (min = 0, max = 32)
647 +Syntax:         <0|1[,...]>
648 +Description:    Read RGB video data instead of BGR:
649 +                1 = use RGB component ordering.
650 +                0 = use BGR component ordering.
651 +                This parameter has effect when using RGBX palettes only.
652 +Default:        0 for every device.
653 +-------------------------------------------------------------------------------
654 +Name:           autobright
655 +Type:           long array (min = 0, max = 32)
656 +Syntax:         <0|1[,...]>
657 +Description:    CMOS sensor automatically changes brightness:
658 +                0 = no, 1 = yes
659 +Default:        0 for every device.
660 +-------------------------------------------------------------------------------
661 +Name:           autoexp
662 +Type:           long array (min = 0, max = 32)
663 +Syntax:         <0|1[,...]>
664 +Description:    CMOS sensor automatically changes exposure:
665 +                0 = no, 1 = yes
666 +Default:        1 for every device.
667 +-------------------------------------------------------------------------------
668 +Name:           lightfreq
669 +Type:           long array (min = 0, max = 32)
670 +Syntax:         <50|60[,...]>
671 +Description:    Light frequency in Hz:
672 +                50 for European and Asian lighting, 60 for American lighting.
673 +Default:        50 for every device.
674 +-------------------------------------------------------------------------------
675 +Name:           bandingfilter
676 +Type:           long array (min = 0, max = 32)
677 +Syntax:         <0|1[,...]> 
678 +Description:    Banding filter to reduce effects of fluorescent 
679 +                lighting:
680 +                0 disabled, 1 enabled.
681 +                This filter tries to reduce the pattern of horizontal
682 +                light/dark bands caused by some (usually fluorescent) lighting.
683 +Default:        0 for every device.
684 +-------------------------------------------------------------------------------
685 +Name:           clockdiv
686 +Type:           long array (min = 0, max = 32)
687 +Syntax:         <-1|n[,...]>
688 +Description:    Force pixel clock divisor to a specific value (for experts):
689 +                n may vary from 0 to 127.
690 +                -1 for automatic value.
691 +                See also the 'double_buffer' module paramater.
692 +Default:        -1 for every device.
693 +-------------------------------------------------------------------------------
694 +Name:           backlight
695 +Type:           long array (min = 0, max = 32)
696 +Syntax:         <0|1[,...]>
697 +Description:    Objects are lit from behind:
698 +                0 = no, 1 = yes
699 +Default:        0 for every device.
700 +-------------------------------------------------------------------------------
701 +Name:           mirror
702 +Type:           long array (min = 0, max = 32)
703 +Syntax:         <0|1[,...]>
704 +Description:    Reverse image horizontally:
705 +                0 = no, 1 = yes
706 +Default:        0 for every device.
707 +-------------------------------------------------------------------------------
708 +Name:           sensor_mono
709 +Type:           long array (min = 0, max = 32)
710 +Syntax:         <0|1[,...]> 
711 +Description:    The CMOS sensor is monochrome:
712 +                0 = no, 1 = yes
713 +Default:        0 for every device.
714 +-------------------------------------------------------------------------------
715 +Name:           brightness
716 +Type:           long array (min = 0, max = 32)
717 +Syntax:         <n[,...]>
718 +Description:    Set picture brightness (0-65535).
719 +                This parameter has no effect if 'autobright' is enabled.
720 +Default:        31000 for every device.
721 +-------------------------------------------------------------------------------
722 +Name:           hue
723 +Type:           long array (min = 0, max = 32)
724 +Syntax:         <n[,...]>
725 +Description:    Set picture hue (0-65535).
726 +Default:        32768 for every device.
727 +-------------------------------------------------------------------------------
728 +Name:           colour
729 +Type:           long array (min = 0, max = 32)
730 +Syntax:         <n[,...]>
731 +Description:    Set picture saturation (0-65535).
732 +Default:        32768 for every device.
733 +-------------------------------------------------------------------------------
734 +Name:           contrast
735 +Type:           long array (min = 0, max = 32)
736 +Syntax:         <n[,...]> 
737 +Description:    Set picture contrast (0-65535).
738 +Default:        50000 for every device.
739 +-------------------------------------------------------------------------------
740 +Name:           whiteness
741 +Type:           long array (min = 0, max = 32)
742 +Syntax:         <n[,...]> 
743 +Description:    Set picture whiteness (0-65535).
744 +Default:        32768 for every device.
745 +-------------------------------------------------------------------------------
746 +Name:           debug
747 +Type:           int
748 +Syntax:         <n> 
749 +Description:    Debugging information level, from 0 to 6:
750 +                0 = none (be cautious)
751 +                1 = critical errors
752 +                2 = significant informations
753 +                3 = configuration or general messages
754 +                4 = warnings
755 +                5 = called functions
756 +                6 = function internals
757 +                Level 5 and 6 are useful for testing only, when just one
758 +                device is used.
759 +Default:        2
760 +-------------------------------------------------------------------------------
761 +Name:           specific_debug
762 +Type:           int
763 +Syntax:         <0|1>
764 +Description:    Enable or disable specific debugging messages:
765 +                0 = print messages concerning every level <= 'debug' level.
766 +                1 = print messages concerning the level indicated by 'debug'.
767 +Default:        0
768 +-------------------------------------------------------------------------------
769 +
770 +
771 +8. Credits
772 +==========
773 +The development would not have proceed much further without having looked at
774 +the source code of other drivers and without the help of several persons; in
775 +particular:
776 +
777 +- the I2C interface to kernel and high-level CMOS sensor control routines have
778 +  been taken from the OV511 driver by Mark McClelland;
779 +
780 +- memory management code has been copied from the bttv driver by Ralph Metzler,
781 +  Marcus Metzler and Gerd Knorr;
782 +
783 +- the low-level I2C read function has been written by Frédéric Jouault, who
784 +  also gave me commented logs about sniffed USB traffic taken from another
785 +  driver for another system;
786 +
787 +- the low-level I2C fast write function has been written by Piotr Czerczak;
788 diff -purN linux-2.5/MAINTAINERS usb-2.5/MAINTAINERS
789 --- linux-2.5/MAINTAINERS       2003-11-11 00:50:25.000000000 +0000
790 +++ usb-2.5/MAINTAINERS 2003-11-12 16:54:36.000000000 +0000
791 @@ -2218,6 +2218,13 @@ M:       dbrownell@users.sourceforge.net
792  L:     linux-usb-devel@lists.sourceforge.net
793  S:     Maintained
794  
795 +USB W996[87]CF DRIVER
796 +P:     Luca Risolia
797 +M:     luca_ing@libero.it
798 +L:     linux-usb-devel@lists.sourceforge.net
799 +W:     http://go.lamarinapunto.com
800 +S:     Maintained
801 +
802  USER-MODE LINUX
803  P:     Jeff Dike
804  M:     jdike@karaya.com
805 diff -purN linux-2.5/arch/i386/Kconfig usb-2.5/arch/i386/Kconfig
806 --- linux-2.5/arch/i386/Kconfig 2003-10-08 21:33:36.000000000 +0000
807 +++ usb-2.5/arch/i386/Kconfig   2003-10-08 20:53:47.000000000 +0000
808 @@ -1203,6 +1203,13 @@ config DEBUG_INFO
809           Say Y here only if you plan to use gdb to debug the kernel.
810           If you don't debug the kernel, you can say N.
811           
812 +config DEBUG_DEV_PRINTK
813 +       bool "Debug dev_printk"
814 +       depends on DEBUG_KERNEL
815 +       help
816 +         If you say Y here, all dev_printk() parameters will be checked before
817 +         dev_printk() is called.  This is useful when debugging new drivers.
818 +
819  config DEBUG_SPINLOCK_SLEEP
820         bool "Sleep-inside-spinlock checking"
821         help
822 diff -purN linux-2.5/drivers/base/bus.c usb-2.5/drivers/base/bus.c
823 --- linux-2.5/drivers/base/bus.c        2003-09-30 15:59:35.000000000 +0000
824 +++ usb-2.5/drivers/base/bus.c  2003-10-10 20:44:38.000000000 +0000
825 @@ -8,7 +8,7 @@
826   *
827   */
828  
829 -#undef DEBUG
830 +#define DEBUG 1
831  
832  #include <linux/device.h>
833  #include <linux/module.h>
834 diff -purN linux-2.5/drivers/base/class.c usb-2.5/drivers/base/class.c
835 --- linux-2.5/drivers/base/class.c      2003-11-07 14:48:28.000000000 +0000
836 +++ usb-2.5/drivers/base/class.c        2003-11-11 22:51:23.000000000 +0000
837 @@ -10,7 +10,7 @@
838   *
839   */
840  
841 -#undef DEBUG
842 +#define DEBUG 1
843  
844  #include <linux/device.h>
845  #include <linux/module.h>
846 diff -purN linux-2.5/drivers/base/core.c usb-2.5/drivers/base/core.c
847 --- linux-2.5/drivers/base/core.c       2003-09-29 21:20:44.000000000 +0000
848 +++ usb-2.5/drivers/base/core.c 2003-10-10 20:44:38.000000000 +0000
849 @@ -8,7 +8,7 @@
850   *
851   */
852  
853 -#undef DEBUG
854 +#define DEBUG 1
855  
856  #include <linux/device.h>
857  #include <linux/err.h>
858 diff -purN linux-2.5/drivers/base/driver.c usb-2.5/drivers/base/driver.c
859 --- linux-2.5/drivers/base/driver.c     2003-06-03 23:19:52.000000000 +0000
860 +++ usb-2.5/drivers/base/driver.c       2003-06-09 17:37:02.000000000 +0000
861 @@ -8,7 +8,7 @@
862   *
863   */
864  
865 -#undef DEBUG
866 +#define DEBUG 1
867  
868  #include <linux/device.h>
869  #include <linux/module.h>
870 diff -purN linux-2.5/drivers/char/Kconfig usb-2.5/drivers/char/Kconfig
871 --- linux-2.5/drivers/char/Kconfig      2003-10-22 05:10:32.000000000 +0000
872 +++ usb-2.5/drivers/char/Kconfig        2003-10-24 18:53:35.000000000 +0000
873 @@ -963,6 +963,13 @@ config SCx200_GPIO
874  
875           If compiled as a module, it will be called scx200_gpio.
876  
877 +config FJKEYINFO
878 +       tristate "Fujitsu Lifebook Application Key Support"
879 +       help
880 +         Provide support for Fujitsu Lifebook application keys.
881 +
882 +         If compiled as a module, it will be called fjkeyinf.
883 +
884  config RAW_DRIVER
885         tristate "RAW driver (/dev/raw/rawN)"
886         help
887 diff -purN linux-2.5/drivers/char/Makefile usb-2.5/drivers/char/Makefile
888 --- linux-2.5/drivers/char/Makefile     2003-10-22 05:10:32.000000000 +0000
889 +++ usb-2.5/drivers/char/Makefile       2003-10-24 18:53:35.000000000 +0000
890 @@ -71,6 +71,7 @@ obj-$(CONFIG_DZ) += dz.o
891  obj-$(CONFIG_NWBUTTON) += nwbutton.o
892  obj-$(CONFIG_NWFLASH) += nwflash.o
893  obj-$(CONFIG_SCx200_GPIO) += scx200_gpio.o
894 +obj-$(CONFIG_FJKEYINFO) += fjkeyinf.o
895  
896  obj-$(CONFIG_WATCHDOG) += watchdog/
897  obj-$(CONFIG_MWAVE) += mwave/
898 diff -purN linux-2.5/drivers/char/fjkeyinf.c usb-2.5/drivers/char/fjkeyinf.c
899 --- linux-2.5/drivers/char/fjkeyinf.c   1970-01-01 00:00:00.000000000 +0000
900 +++ usb-2.5/drivers/char/fjkeyinf.c     2003-08-12 16:04:01.000000000 +0000
901 @@ -0,0 +1,590 @@
902 +/*
903 +    SMBus client for the Fujitsu Siemens Lifebook C-6535 Application Panel
904 +    
905 +    Copyright (C) 2001 Jochen Eisinger <jochen.eisinger@gmx.net>
906 +
907 +    This program is free software; you can redistribute it and/or modify
908 +    it under the terms of the GNU General Public License as published by
909 +    the Free Software Foundation; either version 2 of the License, or
910 +    (at your option) any later version.
911 +
912 +    This program is distributed in the hope that it will be useful,
913 +    but WITHOUT ANY WARRANTY; without even the implied warranty of
914 +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
915 +    GNU General Public License for more details.
916 +
917 +    You should have received a copy of the GNU General Public License
918 +    along with this program; if not, write to the Free Software
919 +    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
920 +*/
921 +#include <linux/config.h>
922 +#include <linux/kernel.h>
923 +#include <linux/module.h>
924 +#include <linux/init.h>
925 +#include <linux/ctype.h>
926 +#include <linux/slab.h>
927 +#include <linux/fs.h>
928 +#include <linux/ioport.h>
929 +#include <linux/types.h>
930 +#include <linux/mm.h>
931 +#include <asm/io.h>
932 +#include <asm/uaccess.h>
933 +#include <linux/i2c.h>
934 +#include <linux/i2c-id.h>
935 +#include <linux/miscdevice.h>
936 +
937 +/* Pulled what was needed from the userspace apanel.h file here */
938 +/* Make sure they match what the userspace tools were build against */
939 +
940 +/* Describes to which subsystem the ioctl applies. 'P' for proprietary? */
941 +#define APANEL_IOCTL_GROUP      'P'
942 +
943 +
944 +
945 +/*
946 + * Use one ioctl for all devices
947 + * This has the advantage that one interface is defined
948 + * for all devices. The caps can tell what is possible on
949 + * a certain device (with some defaults for each device
950 + * of course which the programmer doesn't have to check
951 + * explicitly like on/off for led and read for buttons).
952 + */
953 +
954 +struct apanelcmd {
955 +       int device;           /* Device to operate command on (APANEL_DEV_GEN_*) */
956 +       int cmd;              /* Command to execute (APANEL_CMD_*) */
957 +       int data;             /* Data for command */
958 +};
959 +
960 +
961 +struct fj_device {
962 +       __u8    type;
963 +       __u8    access_method;
964 +       __u8    chip_type;
965 +       __u8    number;
966 +} __attribute__((packed));
967 +
968 +#define DEVICE_APPLICATION_BUTTONS     1
969 +#define DEVICE_CD_BUTTONS              2
970 +#define DEVICE_LCD                     3
971 +#define DEVICE_LED_1                   4
972 +#define DEVICE_LED_2                   6
973 +#define DEVICE_APPLICATION_3_BUTTONS   7
974 +
975 +
976 +#define IOCTL_APANEL_CMD        _IOR(APANEL_IOCTL_GROUP,202,struct apanelcmd)
977 +
978 +
979 +/* Devices */
980 +#define APANEL_DEV_LED          1
981 +#define APANEL_DEV_LCD          2
982 +#define APANEL_DEV_CDBTN        3
983 +#define APANEL_DEV_APPBTN       4
984 +
985 +/*
986 + * Commands
987 + */
988 +
989 +/* Device capabilities */
990 +#define APANEL_CAP_ONOFF        1       /* Turn on/off */
991 +#define APANEL_CAP_GET          2       /* General get command */
992 +#define APANEL_CAP_SET          4       /* General set command */
993 +#define APANEL_CAP_BLINK        8       /* Blinking */
994 +#define APANEL_CAP_DUTY         0x10    /* Duty cycle of blinking */
995 +#define APANEL_CAP_RESET        0x20    /* Reset device */
996 +#define APANEL_CAP_MAX          0x40    /* Get highest possible value for */
997 +                                        /* set/get */
998 +#define APANEL_CAP_MIN          0x80    /* Get lowest possible value */
999 +#define APANEL_CMD_ONOFF        2
1000 +#define APANEL_ONOFF_ON         1       /* Or is APANEL_ON nicer? */
1001 +#define APANEL_ONOFF_OFF        0
1002 +
1003 +#define APANEL_CMD_SET          3
1004 +#define APANEL_CMD_GET          4
1005 +
1006 +#define APANEL_CMD_BLINK        5       /* data=Blink frequency *0.01Hz or so */
1007 +#define APANEL_CMD_DUTY         6       /* data=percentage high */
1008 +
1009 +#define APANEL_CMD_RESET        7       /* If this is useful at all */
1010 +
1011 +#define APANEL_CMD_MAX          8
1012 +#define APANEL_CMD_MIN          9
1013 +
1014 +/*
1015 + * Button masks
1016 + */
1017 +/* Masks for application buttons */
1018 +#define APANEL_APPBTN_A         1
1019 +#define APANEL_APPBTN_B         2
1020 +#define APANEL_APPBTN_INTERNET  4
1021 +#define APANEL_APPBTN_EMAIL     8
1022 +
1023 +/* Masks for cd buttons */
1024 +#define APANEL_CDBTN_STOP       1
1025 +#define APANEL_CDBTN_EJECT      2
1026 +#define APANEL_CDBTN_PLAY       4
1027 +#define APANEL_CDBTN_PAUSE      8
1028 +#define APANEL_CDBTN_BACK       0x10
1029 +#define APANEL_CDBTN_FORW       0x20
1030 +
1031 +
1032 +
1033 +/* print lots of useless debug infos */
1034 +#define DEBUG
1035 +
1036 +#define MY_NAME        "fjkeyinf"
1037 +
1038 +#define dbg(format, arg...)                                    \
1039 +       do {                                                    \
1040 +               if (debug)                                      \
1041 +                       printk(KERN_DEBUG "%s: " format,        \
1042 +                               MY_NAME , ## arg);              \
1043 +       } while (0)
1044 +
1045 +static int debug = 1;
1046 +
1047 +/*
1048 + * this is the internal driver version number. There is no direct relationship
1049 + * between the hardware, the apanel protocol, or the driver versions
1050 + * However, this version number should be increased for every change
1051 + */
1052 +/* current driver version */
1053 +#define FJKEYINF_VERSION_MAJOR 0
1054 +#define FJKEYINF_VERSION_MINOR 4
1055 +
1056 +/*
1057 + * This is the apanel version this driver implements. This _must_ be the
1058 + * same as your apanel.h file
1059 + */
1060 +/* protocol version */
1061 +#define FJKEYINF_APANEL_MAJOR  1
1062 +#define FJKEYINF_APANEL_MINOR  0
1063 +
1064 +/*
1065 + * Some real leet m4cr0s
1066 + */
1067 +#define STRINGIFY1(x)  #x
1068 +#define STRINGIFY(x)   STRINGIFY1(x)
1069 +
1070 +#define PASTE1(x,y)    x##y
1071 +#define PASTE(x,y)     PASTE1(x,y)
1072 +
1073 +/*
1074 + * This is the version of the driver as a string
1075 + */
1076 +#define FJKEYINF_VERSION_STRING        PASTE("v",                              \
1077 +                               PASTE(STRINGIFY(FJKEYINF_VERSION_MAJOR),\
1078 +                               PASTE(".",STRINGIFY(FJKEYINF_VERSION_MINOR))))
1079 +
1080 +/*
1081 + * This is the version of the protocol as a string
1082 + */
1083 +#define FJKEYINF_APANEL_VERSION_STRING PASTE("v",                      \
1084 +                                       PASTE(STRINGIFY(FJKEYINF_APANEL_MAJOR),\
1085 +                                       PASTE(".",                      \
1086 +                                       STRINGIFY(FJKEYINF_APANEL_MINOR))))
1087 +
1088 +/* 
1089 + * every i2c device has to register to the i2c sub-system. Therefor it needs
1090 + * a driver id. We should be I2C_DRIVERID_FJKEYINF. However, if this isn't
1091 + * defined in i2c-id.h, we'll use a generic id.
1092 + */
1093 +#ifndef I2C_DRIVERID_FJKEYINF
1094 +#define I2C_DRIVERID_FJKEYINF  0xF000
1095 +#endif
1096 +
1097 +/*
1098 + * Yes, it's unbelievable, but me crappy driver has an official devices
1099 + * entry. It's register as a misc-device (char-major-10) minor 216. The
1100 + * location should be /dev/fujitsu/apanel... after all, it seems to be
1101 + * a quite c00l driver ;>
1102 + */
1103 +#define FJKEYINF_CHAR_MINOR    216
1104 +
1105 +/*
1106 + * Modules can store nice extra infos...
1107 + */
1108 +MODULE_AUTHOR("Jochen Eisinger <jochen.eisinger@gmx.net>");
1109 +MODULE_DESCRIPTION("Application Panel driver for Lifebook C-series");
1110 +MODULE_LICENSE("GPL");
1111 +
1112 +/*
1113 + * So, let's start the hackin'
1114 + *
1115 + * we first define the interface for the i2c driver, cuz the misc device
1116 + * part uses the struct fjkeyinf_client. also note that this struct is
1117 + * static where it would be better to dynamically allocate one... but what
1118 + * fsck, more than one apanel your crappy laptop won't have...
1119 + */
1120 +
1121 +/* definitions for i2c (smbus) interface */
1122 +
1123 +/* forward declaration of the interface procedures */
1124 +
1125 +/* detach removes the smbus driver from the system */
1126 +       static int fjkeyinf_detach(struct i2c_client *client);
1127 +/* attach tries to attach to a given smbus */
1128 +       static int fjkeyinf_attach(struct i2c_adapter *adap);
1129 +
1130 +/* this structur defines the interface to the i2c sub-system */
1131 +static struct i2c_driver fjkeyinf_driver = {
1132 +       .owner          = THIS_MODULE,
1133 +       .name           = "fujitsu_panel" /* FJKEYINF_VERSION_STRING */,
1134 +       .id             = I2C_DRIVERID_FJKEYINF,
1135 +       .flags          = I2C_DF_NOTIFY,
1136 +       .attach_adapter = &fjkeyinf_attach,
1137 +       .detach_client  = &fjkeyinf_detach,
1138 +       .command        = NULL,
1139 +};
1140 +
1141 +
1142 +/* Addresses to scan. afaik the device is at id 0x18. so we only scan this */
1143 +static unsigned short normal_i2c[] = {0x18,I2C_CLIENT_END};
1144 +static unsigned short normal_i2c_range[] = {I2C_CLIENT_END};
1145 +
1146 +/* 
1147 + * generate some stupid additional structures. we don't really care about
1148 + * this
1149 + */
1150 +I2C_CLIENT_INSMOD;
1151 +
1152 +
1153 +/*
1154 + * If we've found the device, we have to provide an i2c_client structure
1155 + * to the i2c subsystem with which this devices can be accessed. as I stated
1156 + * above, there's max. 1 device, so I use _one static_ entry
1157 + */
1158 +static struct i2c_client fjkeyinf_client = 
1159 +{
1160 +       .id =           -1,
1161 +       .flags =        0,
1162 +       .addr =         0,
1163 +       .adapter =      NULL,
1164 +       .driver =       &fjkeyinf_driver,
1165 +       .name =         "fjkeyinf",
1166 +};
1167 +
1168 +
1169 +/*
1170 + * luckily, the c-series laptops have a configuration block in there BIOS.
1171 + * so we can use it to detect the presence of the apanel device. There's
1172 + * also a checksum somewhere, but we don't care about it.
1173 + *
1174 + * Note the first 8 characters. that's where this strange driver name comes
1175 + * from.
1176 + *
1177 + * The configuration block can be found at 0x000FFA30
1178 + *
1179 + * There should also be an access method 3, but I don't know much about it.
1180 + * Basically there should also be an LCD device. but my notebook hasn't one
1181 + * so I don't know what the configuration block looks like
1182 + *
1183 + * type 1 is LED type 4 ist BUTTONS, probably 2 is LCD.
1184 + */
1185 +static const unsigned char fjkeyinf_info[16] = {
1186 +       'F', 'J', 'K', 'E', 'Y', 'I', 'N', 'F',
1187 +       /* device 0 */  /* type         */      1,
1188 +                       /* access method*/      1,
1189 +                       /* enabled      */      1,
1190 +                       /* smbus device */      0x30,
1191 +       /* device 1 */  /* type         */      4,
1192 +                       /* access method*/      1,
1193 +                       /* enabled      */      1,
1194 +                       /* smbus device */      0x30};
1195 +
1196 +#define FJKEYINF_INFO_ADDR     0x000FFA30
1197 +#define FJKEYINF_INFO_ADDR     0x000F6f20      /* Address for the P2120 */
1198 +
1199 +/*
1200 + * the following functions implement the ioctls. Note however, that not
1201 + * much is implemented yet.
1202 + */
1203 +
1204 +/* turn a device on or off */
1205 +
1206 +int fjkeyinf_onoff(int dev, int state)
1207 +{
1208 +
1209 +       switch (dev) {
1210 +
1211 +               case APANEL_DEV_LED:
1212 +
1213 +                       if (state) {
1214 +                               dbg("turning LED on...\n");
1215 +
1216 +                               i2c_smbus_write_word_data(&fjkeyinf_client,
1217 +                                              0x10, 0x8080);
1218 +                               i2c_smbus_write_word_data(&fjkeyinf_client,
1219 +                                              0x0f, 0x100);
1220 +                               i2c_smbus_write_word_data(&fjkeyinf_client,
1221 +                                              0x11, 1);
1222 +
1223 +                       } else {
1224 +                               
1225 +                               dbg("turning LED off...\n");
1226 +
1227 +                               i2c_smbus_write_word_data(&fjkeyinf_client,
1228 +                                              0x10, 0);
1229 +                               i2c_smbus_write_word_data(&fjkeyinf_client,
1230 +                                              0x0f, 0x100);
1231 +                               i2c_smbus_write_word_data(&fjkeyinf_client,
1232 +                                              0x11, 0);
1233 +
1234 +
1235 +                       }
1236 +
1237 +                       return state;
1238 +
1239 +               default:
1240 +
1241 +                       printk(KERN_NOTICE
1242 +                               "fjkeyinf: ONOFF called for invalid device"
1243 +                               " (dev %d, state %d)\n", dev, state);
1244 +
1245 +                       return -EINVAL;
1246 +
1247 +       }
1248 +
1249 +}
1250 +
1251 +/* gets the current value from a device */
1252 +int fjkeyinf_get(int dev)
1253 +{
1254 +       switch (dev) {
1255 +               case APANEL_DEV_LED:
1256 +                       return ((i2c_smbus_read_word_data
1257 +                                       (&fjkeyinf_client, 0x00) >> 7) & 1);
1258 +
1259 +               case APANEL_DEV_APPBTN:
1260 +                       {
1261 +                               int state;
1262 +
1263 +                               state = i2c_smbus_read_word_data
1264 +                                       (&fjkeyinf_client, 0x00);
1265 +
1266 +                               state = (state >> 8) & 0x0f;
1267 +
1268 +                               state ^= 0x0f;
1269 +
1270 +                               return (((state & 1) ? APANEL_APPBTN_EMAIL : 0)
1271 +                                       + ((state & 2) ? APANEL_APPBTN_INTERNET : 0)
1272 +                                       + ((state & 4) ? APANEL_APPBTN_A : 0)
1273 +                                       + ((state & 8) ? APANEL_APPBTN_B : 0));
1274 +                       }
1275 +
1276 +               default:
1277 +                       printk(KERN_NOTICE "fjkeyinf: GET called for invalid"
1278 +                                       " device (dev %d)\n", dev);
1279 +                       return -EINVAL;
1280 +       }
1281 +}
1282 +
1283 +
1284 +
1285 +/* 
1286 + * file operations for /dev/fujitsu/apanel
1287 + * 
1288 + * That what the name says: file operation. pretty basic stuff follows
1289 + */
1290 +                       
1291 +/*
1292 + * if somebody opens us, we just realize and let him pass
1293 + */
1294 +static int fjkeyinf_open (struct inode *inode, struct file *filp)
1295 +{
1296 +       dbg("open called for /dev/fujitsu/apanel\n");
1297 +       return 0;
1298 +}
1299 +
1300 +/* same with close */
1301 +static int fjkeyinf_close (struct inode *inode, struct file *filp)
1302 +{
1303 +       dbg("close called for /dev/fujitsu/apanel\n");
1304 +       return 0;
1305 +}
1306 +
1307 +/* all commands are passed using the ioctl interface. so we have to decide
1308 + * here, what we have to do */
1309 +int fjkeyinf_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
1310 +               unsigned long args)
1311 +{
1312 +       struct apanelcmd *acmd;
1313 +
1314 +       dbg("ioctl (cmd: %u, args: 0x%08lx)\n", cmd, args);
1315 +
1316 +       /* Let's see, what they want from us... */
1317 +       
1318 +       switch (cmd) {
1319 +               case IOCTL_APANEL_CMD:
1320 +                       /* the actual command is passed in a apanelcmd
1321 +                        * structure */
1322 +
1323 +                       if (!(args)) {
1324 +
1325 +                               printk(KERN_NOTICE "fjkeyinf: invalid apanel command "
1326 +                                               "(NULL pointer)\n");
1327 +                               return -EINVAL;
1328 +
1329 +                       }
1330 +
1331 +                       acmd = (struct apanelcmd *)args;
1332 +
1333 +                       /* although not all commands are implemented, we
1334 +                        * understand all... */
1335 +
1336 +                       dbg("apanel command %d\n", acmd->cmd);
1337 +
1338 +
1339 +                       switch (acmd->cmd) {
1340 +                               case APANEL_CMD_ONOFF:
1341 +                                       return fjkeyinf_onoff(acmd->device,
1342 +                                                       acmd->data);
1343 +
1344 +                               case APANEL_CMD_GET:
1345 +                                       return fjkeyinf_get(acmd->device);
1346 +
1347 +                               default:
1348 +                                       printk(KERN_NOTICE "fjkeyinf: unknown "
1349 +                                               "device/command %d/%d\n",
1350 +                                               acmd->device, acmd->cmd);
1351 +                                       return -EINVAL;
1352 +                       }
1353 +
1354 +               default:
1355 +                       printk(KERN_NOTICE "fjkeyinf: unknown ioctl code %u\n", cmd);
1356 +                       return -EINVAL;
1357 +       }
1358 +}
1359 +
1360 +/* now we tell the misc_device what nice functions we've implemented */
1361 +static struct file_operations fjkeyinf_fops = {
1362 +       .owner =        THIS_MODULE,
1363 +       .ioctl =        fjkeyinf_ioctl,
1364 +       .open =         fjkeyinf_open,
1365 +       .release =      fjkeyinf_close,
1366 +};
1367 +
1368 +/* misc dev entry. We need this to register to the misc dev driver */
1369 +static struct miscdevice fjkeyinf_dev = {
1370 +       FJKEYINF_CHAR_MINOR,
1371 +       "apanel",
1372 +       &fjkeyinf_fops
1373 +};
1374 +
1375 +
1376 +/* Now comes the i2c driver stuff. This is pretty straight forward, just as they
1377 + * described it in their docu.
1378 + */
1379 +
1380 +/* basically this function should probe the i2c client, but we know that it has
1381 + * to be the one we're looking for - and I have no idea how I should probe for
1382 + * it, so we just register... */
1383 +static int fjkeyinf_probe(struct i2c_adapter *adap, int addr, int kind)
1384 +{
1385 +       int result;
1386 +        fjkeyinf_client.adapter = adap;
1387 +        fjkeyinf_client.addr = addr;
1388 +
1389 +       dbg("%s\n", __FUNCTION__);
1390 +       if ((result = misc_register(&fjkeyinf_dev)) < 0) {
1391 +               printk(KERN_NOTICE "fjkeyinf: could not register misc device (%d)\n",
1392 +                               result);
1393 +               return result;
1394 +       }
1395 +
1396 +        i2c_attach_client(&fjkeyinf_client);
1397 +
1398 +       printk(KERN_INFO "fjkeyinf: Application Panel Driver "
1399 +                       /*FJKEYINF_VERSION_STRING*/ "\n");
1400 +       printk(KERN_INFO "fjkeyinf: Copyright (c) 2001 by "
1401 +               "Jochen Eisinger <jochen.eisinger@gmx.net>\n");
1402 +
1403 +       
1404 +       dbg("driver loaded at address 0x%02x...\n", addr);
1405 +       
1406 +       return 0;
1407 +}
1408 +
1409 +
1410 +/* this function is invoked, when we should release our resource... */
1411 +static int fjkeyinf_detach(struct i2c_client *client)
1412 +{
1413 +       dbg("driver detached...\n");
1414 +
1415 +       misc_deregister(&fjkeyinf_dev);
1416 +               
1417 +       i2c_detach_client(client);
1418 +       
1419 +       return 0;
1420 +}
1421 +
1422 +/* this function is invoked for every i2c adapter, that has a device at the
1423 + * address we've specified */
1424 +static int fjkeyinf_attach(struct i2c_adapter *adap)
1425 +{
1426 +       dbg("%s\n", __FUNCTION__);
1427 +       return i2c_probe(adap, &addr_data, fjkeyinf_probe);
1428 +}
1429 +
1430 +
1431 +
1432 +/* startup */
1433 +static int __init fjkeyinf_init(void)
1434 +{
1435 +       unsigned char *fujitsu_bios = __va(FJKEYINF_INFO_ADDR);
1436 +//     int ctr;
1437 +       struct fj_device        *dev;
1438 +       
1439 +       if (__pa(high_memory) < (FJKEYINF_INFO_ADDR - 16)) {
1440 +               dbg("Fujitsu BIOS not found...\n");
1441 +               return -ENODEV;
1442 +       }
1443 +
1444 +       dbg("Configuration block [%c%c%c%c%c%c%c%c] "
1445 +               "(%d, %d, %d, 0x%02x) (%d, %d, %d, 0x%02x)\n",
1446 +               fujitsu_bios[0],
1447 +               fujitsu_bios[1],
1448 +               fujitsu_bios[2],
1449 +               fujitsu_bios[3],
1450 +               fujitsu_bios[4],
1451 +               fujitsu_bios[5],
1452 +               fujitsu_bios[6],
1453 +               fujitsu_bios[7],
1454 +               (int)fujitsu_bios[8],
1455 +               (int)fujitsu_bios[9],
1456 +               (int)fujitsu_bios[10],
1457 +               (int)fujitsu_bios[11],
1458 +               (int)fujitsu_bios[12],
1459 +               (int)fujitsu_bios[13],
1460 +               (int)fujitsu_bios[14],
1461 +               (int)fujitsu_bios[15]);
1462 +
1463 +       dev = (struct fj_device *)&fujitsu_bios[8];
1464 +       while (1) {
1465 +               if (dev->type == 0)
1466 +                       break;
1467 +               dbg("type = %d, access_method = %d, chip_type = %d, number = %d\n",
1468 +                   dev->type, dev->access_method, dev->chip_type, dev->number);
1469 +               ++dev;
1470 +       }
1471 +       
1472 +//     for (ctr=0 ; ctr<16 ; ctr++)
1473 +//             if (fujitsu_bios[ctr] != fjkeyinf_info[ctr]) {
1474 +//                     dbg("device not found...\n");
1475 +//                     return -ENODEV;
1476 +//             }
1477 +
1478 +       dbg("device found...\n");
1479 +       
1480 +       i2c_add_driver(&fjkeyinf_driver);
1481 +       return 0;
1482 +}
1483 +
1484 +static void __exit fjkeyinf_exit(void)
1485 +{
1486 +       i2c_del_driver(&fjkeyinf_driver);
1487 +}
1488 +
1489 +module_init(fjkeyinf_init);
1490 +module_exit(fjkeyinf_exit);
1491 +
1492 diff -purN linux-2.5/drivers/char/mem.c usb-2.5/drivers/char/mem.c
1493 --- linux-2.5/drivers/char/mem.c        2003-10-22 05:10:25.000000000 +0000
1494 +++ usb-2.5/drivers/char/mem.c  2003-10-24 18:53:35.000000000 +0000
1495 @@ -24,6 +24,7 @@
1496  #include <linux/smp_lock.h>
1497  #include <linux/devfs_fs_kernel.h>
1498  #include <linux/ptrace.h>
1499 +#include <linux/device.h>
1500  
1501  #include <asm/uaccess.h>
1502  #include <asm/io.h>
1503 @@ -657,7 +658,7 @@ static struct file_operations memory_fop
1504         .open           = memory_open,  /* just a selector for the real open */
1505  };
1506  
1507 -static const struct {
1508 +static const struct mem_dev {
1509         unsigned int            minor;
1510         char                    *name;
1511         umode_t                 mode;
1512 @@ -676,6 +677,23 @@ static const struct {
1513         {11,"kmsg",    S_IRUGO | S_IWUSR,           &kmsg_fops},
1514  };
1515  
1516 +static void release_mem_dev(struct class_device *class_dev)
1517 +{
1518 +       kfree(class_dev);
1519 +}
1520 +
1521 +static struct class mem_class = {
1522 +       .name           = "mem",
1523 +       .release        = &release_mem_dev,
1524 +};
1525 +
1526 +static ssize_t show_dev(struct class_device *class_dev, char *buf)
1527 +{
1528 +       struct mem_dev *mem_dev = class_get_devdata(class_dev);
1529 +       return print_dev_t(buf, MKDEV(MEM_MAJOR, mem_dev->minor));
1530 +}
1531 +static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
1532 +
1533  static int __init chr_dev_init(void)
1534  {
1535         int i;
1536 @@ -683,7 +701,20 @@ static int __init chr_dev_init(void)
1537         if (register_chrdev(MEM_MAJOR,"mem",&memory_fops))
1538                 printk("unable to get major %d for memory devs\n", MEM_MAJOR);
1539  
1540 +       class_register(&mem_class);
1541         for (i = 0; i < ARRAY_SIZE(devlist); i++) {
1542 +               struct class_device *class_dev;
1543 +
1544 +               class_dev = kmalloc(sizeof(*class_dev), GFP_KERNEL);
1545 +               if (class_dev) {
1546 +                       memset(class_dev, 0x00, sizeof(*class_dev));
1547 +                       class_dev->class = &mem_class;
1548 +                       strncpy(class_dev->class_id, devlist[i].name, BUS_ID_SIZE);
1549 +                       class_set_devdata(class_dev, (void *)&devlist[i]);
1550 +                       if (!class_device_register(class_dev));
1551 +                               class_device_create_file(class_dev, &class_device_attr_dev);
1552 +               }
1553 +
1554                 devfs_mk_cdev(MKDEV(MEM_MAJOR, devlist[i].minor),
1555                                 S_IFCHR | devlist[i].mode, devlist[i].name);
1556         }
1557 diff -purN linux-2.5/drivers/char/misc.c usb-2.5/drivers/char/misc.c
1558 --- linux-2.5/drivers/char/misc.c       2003-10-04 12:55:45.000000000 +0000
1559 +++ usb-2.5/drivers/char/misc.c 2003-12-10 01:44:11.000000000 +0000
1560 @@ -47,7 +47,7 @@
1561  #include <linux/devfs_fs_kernel.h>
1562  #include <linux/stat.h>
1563  #include <linux/init.h>
1564 -
1565 +#include <linux/device.h>
1566  #include <linux/tty.h>
1567  #include <linux/kmod.h>
1568  
1569 @@ -180,6 +180,91 @@ fail:
1570         return err;
1571  }
1572  
1573 +/* Misc class implementation */
1574 +
1575 +/* 
1576 + * TODO for 2.7:
1577 + *  - add a struct class_device to struct miscdevice and make all usages of
1578 + *    them dynamic.  This will let us get rid of struct misc_dev below.
1579 + */
1580 +struct misc_dev {
1581 +       struct list_head node;
1582 +       dev_t dev;
1583 +       struct class_device class_dev;
1584 +};
1585 +#define to_misc_dev(d) container_of(d, struct misc_dev, class_dev)
1586 +
1587 +static LIST_HEAD(misc_dev_list);
1588 +static spinlock_t misc_dev_list_lock = SPIN_LOCK_UNLOCKED;
1589 +
1590 +static void release_misc_dev(struct class_device *class_dev)
1591 +{
1592 +       struct misc_dev *misc_dev = to_misc_dev(class_dev);
1593 +       kfree(misc_dev);
1594 +}
1595 +
1596 +static struct class misc_class = {
1597 +       .name           = "misc",
1598 +       .release        = &release_misc_dev,
1599 +};
1600 +
1601 +static ssize_t show_dev(struct class_device *class_dev, char *buf)
1602 +{
1603 +       struct misc_dev *misc_dev = to_misc_dev(class_dev);
1604 +       return print_dev_t(buf, misc_dev->dev);
1605 +}
1606 +static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
1607 +
1608 +static void misc_add_class_device(struct miscdevice *misc)
1609 +{
1610 +       struct misc_dev *misc_dev = NULL;
1611 +       int retval;
1612 +
1613 +       misc_dev = kmalloc(sizeof(*misc_dev), GFP_KERNEL);
1614 +       if (!misc_dev)
1615 +               return;
1616 +       memset(misc_dev, 0x00, sizeof(*misc_dev));
1617 +
1618 +       misc_dev->dev = MKDEV(MISC_MAJOR, misc->minor);
1619 +       misc_dev->class_dev.dev = misc->dev;
1620 +       misc_dev->class_dev.class = &misc_class;
1621 +       snprintf(misc_dev->class_dev.class_id, BUS_ID_SIZE, "%s", misc->name);
1622 +       retval = class_device_register(&misc_dev->class_dev);
1623 +       if (retval)
1624 +               goto error;
1625 +       class_device_create_file(&misc_dev->class_dev, &class_device_attr_dev);
1626 +       spin_lock(&misc_dev_list_lock);
1627 +       list_add(&misc_dev->node, &misc_dev_list);
1628 +       spin_unlock(&misc_dev_list_lock);
1629 +       return;
1630 +error:
1631 +       kfree(misc_dev);
1632 +}
1633 +
1634 +static void misc_remove_class_device(struct miscdevice *misc)
1635 +{
1636 +       struct misc_dev *misc_dev = NULL;
1637 +       struct list_head *tmp;
1638 +       int found = 0;
1639 +
1640 +       spin_lock(&misc_dev_list_lock);
1641 +       list_for_each(tmp, &misc_dev_list) {
1642 +               misc_dev = list_entry(tmp, struct misc_dev, node);
1643 +               if ((MINOR(misc_dev->dev) == misc->minor)) {
1644 +                       found = 1;
1645 +                       break;
1646 +               }
1647 +       }
1648 +       if (found) {
1649 +               list_del(&misc_dev->node);
1650 +               spin_unlock(&misc_dev_list_lock);
1651 +               class_device_unregister(&misc_dev->class_dev);
1652 +       } else {
1653 +               spin_unlock(&misc_dev_list_lock);
1654 +       }
1655 +}
1656 +
1657 +
1658  static struct file_operations misc_fops = {
1659         .owner          = THIS_MODULE,
1660         .open           = misc_open,
1661 @@ -236,6 +321,7 @@ int misc_register(struct miscdevice * mi
1662  
1663         devfs_mk_cdev(MKDEV(MISC_MAJOR, misc->minor),
1664                         S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP, misc->devfs_name);
1665 +       misc_add_class_device(misc);
1666  
1667         /*
1668          * Add it to the front, so that later devices can "override"
1669 @@ -265,6 +351,7 @@ int misc_deregister(struct miscdevice * 
1670  
1671         down(&misc_sem);
1672         list_del(&misc->list);
1673 +       misc_remove_class_device(misc);
1674         devfs_remove(misc->devfs_name);
1675         if (i < DYNAMIC_MINORS && i>0) {
1676                 misc_minors[i>>3] &= ~(1 << (misc->minor & 7));
1677 @@ -285,6 +372,7 @@ static int __init misc_init(void)
1678         if (ent)
1679                 ent->proc_fops = &misc_proc_fops;
1680  #endif
1681 +       class_register(&misc_class);
1682  #ifdef CONFIG_MVME16x
1683         rtc_MK48T08_init();
1684  #endif
1685 @@ -319,4 +407,4 @@ static int __init misc_init(void)
1686         }
1687         return 0;
1688  }
1689 -module_init(misc_init);
1690 +subsys_initcall(misc_init);
1691 diff -purN linux-2.5/drivers/char/sysrq.c usb-2.5/drivers/char/sysrq.c
1692 --- linux-2.5/drivers/char/sysrq.c      2003-09-24 06:09:46.000000000 +0000
1693 +++ usb-2.5/drivers/char/sysrq.c        2003-09-26 16:37:41.000000000 +0000
1694 @@ -266,7 +266,7 @@ static struct sysrq_key_op *sysrq_key_ta
1695  /* v */        NULL, /* May be assigned at init time by SMP VOYAGER */
1696  /* w */        NULL,
1697  /* x */        NULL,
1698 -/* y */        NULL,
1699 +/* y */        &sysrq_mountro_op,      /* stupid fujitsu laptop, can't hit the U key */
1700  /* z */        NULL
1701  };
1702  
1703 diff -purN linux-2.5/drivers/char/vc_screen.c usb-2.5/drivers/char/vc_screen.c
1704 --- linux-2.5/drivers/char/vc_screen.c  2003-08-26 16:25:41.000000000 +0000
1705 +++ usb-2.5/drivers/char/vc_screen.c    2003-12-09 00:49:27.000000000 +0000
1706 @@ -36,6 +36,7 @@
1707  #include <linux/kbd_kern.h>
1708  #include <linux/console.h>
1709  #include <linux/smp_lock.h>
1710 +#include <linux/device.h>
1711  #include <asm/uaccess.h>
1712  #include <asm/byteorder.h>
1713  #include <asm/unaligned.h>
1714 @@ -469,6 +470,85 @@ static struct file_operations vcs_fops =
1715         .open           = vcs_open,
1716  };
1717  
1718 +/* vc class implementation */
1719 +
1720 +struct vc_dev {
1721 +       struct list_head node;
1722 +       dev_t dev;
1723 +       struct class_device class_dev;
1724 +};
1725 +#define to_vc_dev(d) container_of(d, struct vc_dev, class_dev)
1726 +
1727 +static LIST_HEAD(vc_dev_list);
1728 +static spinlock_t vc_dev_list_lock = SPIN_LOCK_UNLOCKED;
1729 +
1730 +static void release_vc_dev(struct class_device *class_dev)
1731 +{
1732 +       struct vc_dev *vc_dev = to_vc_dev(class_dev);
1733 +       kfree(vc_dev);
1734 +}
1735 +
1736 +static struct class vc_class = {
1737 +       .name           = "vc",
1738 +       .release        = &release_vc_dev,
1739 +};
1740 +
1741 +static ssize_t show_dev(struct class_device *class_dev, char *buf)
1742 +{
1743 +       struct vc_dev *vc_dev = to_vc_dev(class_dev);
1744 +       return print_dev_t(buf, vc_dev->dev);
1745 +}
1746 +static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
1747 +
1748 +static int vc_add_class_device(dev_t dev, char *name, int minor)
1749 +{
1750 +       struct vc_dev *vc_dev = NULL;
1751 +       int retval;
1752 +
1753 +       vc_dev = kmalloc(sizeof(*vc_dev), GFP_KERNEL);
1754 +       if (!vc_dev)
1755 +               return -ENOMEM;
1756 +       memset(vc_dev, 0x00, sizeof(*vc_dev));
1757 +
1758 +       vc_dev->dev = dev;
1759 +       vc_dev->class_dev.class = &vc_class;
1760 +       snprintf(vc_dev->class_dev.class_id, BUS_ID_SIZE, name, minor);
1761 +       retval = class_device_register(&vc_dev->class_dev);
1762 +       if (retval)
1763 +               goto error;
1764 +       class_device_create_file(&vc_dev->class_dev, &class_device_attr_dev);
1765 +       spin_lock(&vc_dev_list_lock);
1766 +       list_add(&vc_dev->node, &vc_dev_list);
1767 +       spin_unlock(&vc_dev_list_lock);
1768 +       return 0;
1769 +error:
1770 +       kfree(vc_dev);
1771 +       return retval;
1772 +}
1773 +
1774 +static void vc_remove_class_device(int minor)
1775 +{
1776 +       struct vc_dev *vc_dev = NULL;
1777 +       struct list_head *tmp;
1778 +       int found = 0;
1779 +
1780 +       spin_lock(&vc_dev_list_lock);
1781 +       list_for_each(tmp, &vc_dev_list) {
1782 +               vc_dev = list_entry(tmp, struct vc_dev, node);
1783 +               if (MINOR(vc_dev->dev) == minor) {
1784 +                       found = 1;
1785 +                       break;
1786 +               }
1787 +       }
1788 +       if (found) {
1789 +               list_del(&vc_dev->node);
1790 +               spin_unlock(&vc_dev_list_lock);
1791 +               class_device_unregister(&vc_dev->class_dev);
1792 +       } else {
1793 +               spin_unlock(&vc_dev_list_lock);
1794 +       }
1795 +}
1796 +
1797  void vcs_make_devfs(struct tty_struct *tty)
1798  {
1799         devfs_mk_cdev(MKDEV(VCS_MAJOR, tty->index + 1),
1800 @@ -477,19 +557,26 @@ void vcs_make_devfs(struct tty_struct *t
1801         devfs_mk_cdev(MKDEV(VCS_MAJOR, tty->index + 129),
1802                         S_IFCHR|S_IRUSR|S_IWUSR,
1803                         "vcc/a%u", tty->index + 1);
1804 +       vc_add_class_device(MKDEV(VCS_MAJOR, tty->index + 1), "vcs%u", tty->index + 1);
1805 +       vc_add_class_device(MKDEV(VCS_MAJOR, tty->index + 129), "vcsa%u", tty->index + 1);
1806  }
1807  void vcs_remove_devfs(struct tty_struct *tty)
1808  {
1809         devfs_remove("vcc/%u", tty->index + 1);
1810         devfs_remove("vcc/a%u", tty->index + 1);
1811 +       vc_remove_class_device(tty->index + 1);
1812 +       vc_remove_class_device(tty->index + 129);
1813  }
1814  
1815  int __init vcs_init(void)
1816  {
1817         if (register_chrdev(VCS_MAJOR, "vcs", &vcs_fops))
1818                 panic("unable to get major %d for vcs device", VCS_MAJOR);
1819 +       class_register(&vc_class);
1820  
1821         devfs_mk_cdev(MKDEV(VCS_MAJOR, 0), S_IFCHR|S_IRUSR|S_IWUSR, "vcc/0");
1822         devfs_mk_cdev(MKDEV(VCS_MAJOR, 128), S_IFCHR|S_IRUSR|S_IWUSR, "vcc/a0");
1823 +       vc_add_class_device(MKDEV(VCS_MAJOR, 0), "vcs", 0);
1824 +       vc_add_class_device(MKDEV(VCS_MAJOR, 128), "vcsa", 128);
1825         return 0;
1826  }
1827 diff -purN linux-2.5/drivers/i2c/algos/i2c-algo-bit.c usb-2.5/drivers/i2c/algos/i2c-algo-bit.c
1828 --- linux-2.5/drivers/i2c/algos/i2c-algo-bit.c  2003-09-23 13:29:27.000000000 +0000
1829 +++ usb-2.5/drivers/i2c/algos/i2c-algo-bit.c    2003-11-15 15:42:51.000000000 +0000
1830 @@ -18,10 +18,8 @@
1831      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.               */
1832  /* ------------------------------------------------------------------------- */
1833  
1834 -/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even
1835 -   Frodo Looijaard <frodol@dds.nl> */
1836 -
1837 -/* $Id: i2c-algo-bit.c,v 1.44 2003/01/21 08:08:16 kmalkki Exp $ */
1838 +/* With some changes from Frodo Looijaard <frodol@dds.nl>, Kyösti Mälkki
1839 +   <kmalkki@cc.hut.fi> and Jean Delvare <khali@linux-fr.org> */
1840  
1841  /* #define DEBUG 1 */
1842  
1843 @@ -87,8 +85,10 @@ static inline int sclhi(struct i2c_algo_
1844         setscl(adap,1);
1845  
1846         /* Not all adapters have scl sense line... */
1847 -       if (adap->getscl == NULL )
1848 +       if (adap->getscl == NULL ) {
1849 +               udelay(adap->udelay);
1850                 return 0;
1851 +       }
1852  
1853         start=jiffies;
1854         while (! getscl(adap) ) {       
1855 @@ -222,68 +222,72 @@ static int i2c_inb(struct i2c_adapter *i
1856   */
1857  static int test_bus(struct i2c_algo_bit_data *adap, char* name) {
1858         int scl,sda;
1859 +
1860 +       if (adap->getscl==NULL)
1861 +               printk(KERN_INFO "i2c-algo-bit.o: Testing SDA only, "
1862 +                       "SCL is not readable.\n");
1863 +
1864         sda=getsda(adap);
1865 -       if (adap->getscl==NULL) {
1866 -               printk(KERN_WARNING "i2c-algo-bit.o: Warning: Adapter can't read from clock line - skipping test.\n");
1867 -               return 0;               
1868 -       }
1869 -       scl=getscl(adap);
1870 -       printk(KERN_INFO "i2c-algo-bit.o: Adapter: %s scl: %d  sda: %d -- testing...\n",
1871 -              name,getscl(adap),getsda(adap));
1872 +       scl=(adap->getscl==NULL?1:getscl(adap));
1873 +       printk(KERN_DEBUG "i2c-algo-bit.o: (0) scl=%d, sda=%d\n",scl,sda);
1874         if (!scl || !sda ) {
1875 -               printk(KERN_INFO " i2c-algo-bit.o: %s seems to be busy.\n",name);
1876 +               printk(KERN_WARNING "i2c-algo-bit.o: %s seems to be busy.\n", name);
1877                 goto bailout;
1878         }
1879 +
1880         sdalo(adap);
1881 -       printk(KERN_DEBUG "i2c-algo-bit.o:1 scl: %d  sda: %d \n",getscl(adap),
1882 -              getsda(adap));
1883 -       if ( 0 != getsda(adap) ) {
1884 -               printk(KERN_WARNING "i2c-algo-bit.o: %s SDA stuck high!\n",name);
1885 -               sdahi(adap);
1886 +       sda=getsda(adap);
1887 +       scl=(adap->getscl==NULL?1:getscl(adap));
1888 +       printk(KERN_DEBUG "i2c-algo-bit.o: (1) scl=%d, sda=%d\n",scl,sda);
1889 +       if ( 0 != sda ) {
1890 +               printk(KERN_WARNING "i2c-algo-bit.o: SDA stuck high!\n");
1891                 goto bailout;
1892         }
1893 -       if ( 0 == getscl(adap) ) {
1894 -               printk(KERN_WARNING "i2c-algo-bit.o: %s SCL unexpected low while pulling SDA low!\n",
1895 -                       name);
1896 +       if ( 0 == scl ) {
1897 +               printk(KERN_WARNING "i2c-algo-bit.o: SCL unexpected low "
1898 +                       "while pulling SDA low!\n");
1899                 goto bailout;
1900         }               
1901 +
1902         sdahi(adap);
1903 -       printk(KERN_DEBUG "i2c-algo-bit.o:2 scl: %d  sda: %d \n",getscl(adap),
1904 -              getsda(adap));
1905 -       if ( 0 == getsda(adap) ) {
1906 -               printk(KERN_WARNING "i2c-algo-bit.o: %s SDA stuck low!\n",name);
1907 -               sdahi(adap);
1908 +       sda=getsda(adap);
1909 +       scl=(adap->getscl==NULL?1:getscl(adap));
1910 +       printk(KERN_DEBUG "i2c-algo-bit.o: (2) scl=%d, sda=%d\n",scl,sda);
1911 +       if ( 0 == sda ) {
1912 +               printk(KERN_WARNING "i2c-algo-bit.o: SDA stuck low!\n");
1913                 goto bailout;
1914         }
1915 -       if ( 0 == getscl(adap) ) {
1916 -               printk(KERN_WARNING "i2c-algo-bit.o: %s SCL unexpected low while SDA high!\n",
1917 -                      name);
1918 -       goto bailout;
1919 +       if ( 0 == scl ) {
1920 +               printk(KERN_WARNING "i2c-algo-bit.o: SCL unexpected low "
1921 +                       "while pulling SDA high!\n");
1922 +               goto bailout;
1923         }
1924 +
1925         scllo(adap);
1926 -       printk(KERN_DEBUG "i2c-algo-bit.o:3 scl: %d  sda: %d \n",getscl(adap),
1927 -              getsda(adap));
1928 -       if ( 0 != getscl(adap) ) {
1929 -               printk(KERN_WARNING "i2c-algo-bit.o: %s SCL stuck high!\n",name);
1930 -               sclhi(adap);
1931 +       sda=getsda(adap);
1932 +       scl=(adap->getscl==NULL?0:getscl(adap));
1933 +       printk(KERN_DEBUG "i2c-algo-bit.o: (3) scl=%d, sda=%d\n",scl,sda);
1934 +       if ( 0 != scl ) {
1935 +               printk(KERN_WARNING "i2c-algo-bit.o: SCL stuck high!\n");
1936                 goto bailout;
1937         }
1938 -       if ( 0 == getsda(adap) ) {
1939 -               printk(KERN_WARNING "i2c-algo-bit.o: %s SDA unexpected low while pulling SCL low!\n",
1940 -                       name);
1941 +       if ( 0 == sda ) {
1942 +               printk(KERN_WARNING "i2c-algo-bit.o: SDA unexpected low "
1943 +                       "while pulling SCL low!\n");
1944                 goto bailout;
1945         }
1946 +       
1947         sclhi(adap);
1948 -       printk(KERN_DEBUG "i2c-algo-bit.o:4 scl: %d  sda: %d \n",getscl(adap),
1949 -              getsda(adap));
1950 -       if ( 0 == getscl(adap) ) {
1951 -               printk(KERN_WARNING "i2c-algo-bit.o: %s SCL stuck low!\n",name);
1952 -               sclhi(adap);
1953 +       sda=getsda(adap);
1954 +       scl=(adap->getscl==NULL?1:getscl(adap));
1955 +       printk(KERN_DEBUG "i2c-algo-bit.o: (4) scl=%d, sda=%d\n",scl,sda);
1956 +       if ( 0 == scl ) {
1957 +               printk(KERN_WARNING "i2c-algo-bit.o: SCL stuck low!\n");
1958                 goto bailout;
1959         }
1960 -       if ( 0 == getsda(adap) ) {
1961 -               printk(KERN_WARNING "i2c-algo-bit.o: %s SDA unexpected low while SCL high!\n",
1962 -                       name);
1963 +       if ( 0 == sda ) {
1964 +               printk(KERN_WARNING "i2c-algo-bit.o: SDA unexpected low "
1965 +                       "while pulling SCL high!\n");
1966                 goto bailout;
1967         }
1968         printk(KERN_INFO "i2c-algo-bit.o: %s passed test.\n",name);
1969 diff -purN linux-2.5/drivers/i2c/busses/Kconfig usb-2.5/drivers/i2c/busses/Kconfig
1970 --- linux-2.5/drivers/i2c/busses/Kconfig        2003-10-10 11:14:48.000000000 +0000
1971 +++ usb-2.5/drivers/i2c/busses/Kconfig  2003-11-29 17:31:41.000000000 +0000
1972 @@ -161,11 +161,12 @@ config I2C_PIIX4
1973         help
1974           If you say yes to this option, support will be included for the Intel
1975           PIIX4 family of mainboard I2C interfaces.  Specifically, the following
1976 -         versions of the chipset is supported:
1977 +         versions of the chipset are supported:
1978             Intel PIIX4
1979             Intel 440MX
1980             Serverworks OSB4
1981             Serverworks CSB5
1982 +           Serverworks CSB6
1983             SMSC Victory66
1984  
1985           This driver can also be built as a module.  If so, the module
1986 @@ -309,6 +310,7 @@ config I2C_VIAPRO
1987           8233
1988           8233A
1989           8235
1990 +         8237
1991  
1992           This driver can also be built as a module.  If so, the module
1993           will be called i2c-viapro.
1994 diff -purN linux-2.5/drivers/i2c/busses/i2c-elektor.c usb-2.5/drivers/i2c/busses/i2c-elektor.c
1995 --- linux-2.5/drivers/i2c/busses/i2c-elektor.c  2003-09-23 13:29:27.000000000 +0000
1996 +++ usb-2.5/drivers/i2c/busses/i2c-elektor.c    2003-09-26 16:37:42.000000000 +0000
1997 @@ -119,12 +119,16 @@ static void pcf_isa_waitforpin(void) {
1998         int timeout = 2;
1999  
2000         if (irq > 0) {
2001 -               cli();
2002 +               /* This cli() stuff has to get cleaned up */
2003 +               #if defined(CONFIG_SMP)
2004 +               WARN_ON(1);
2005 +               #endif
2006 +               /* cli(); */
2007                 if (pcf_pending == 0) {
2008                         interruptible_sleep_on_timeout(&pcf_wait, timeout*HZ );
2009                 } else
2010                         pcf_pending = 0;
2011 -               sti();
2012 +               /* sti(); */
2013         } else {
2014                 udelay(100);
2015         }
2016 diff -purN linux-2.5/drivers/i2c/busses/i2c-ite.c usb-2.5/drivers/i2c/busses/i2c-ite.c
2017 --- linux-2.5/drivers/i2c/busses/i2c-ite.c      2003-09-22 14:58:42.000000000 +0000
2018 +++ usb-2.5/drivers/i2c/busses/i2c-ite.c        2003-09-23 20:07:56.000000000 +0000
2019 @@ -45,7 +45,6 @@
2020  #include <linux/i2c.h>
2021  #include <linux/i2c-algo-ite.h>
2022  #include <linux/i2c-adap-ite.h>
2023 -#include "../i2c-ite.h"
2024  
2025  #define DEFAULT_BASE  0x14014030
2026  #define ITE_IIC_IO_SIZE        0x40
2027 diff -purN linux-2.5/drivers/i2c/busses/i2c-piix4.c usb-2.5/drivers/i2c/busses/i2c-piix4.c
2028 --- linux-2.5/drivers/i2c/busses/i2c-piix4.c    2003-09-22 16:02:10.000000000 +0000
2029 +++ usb-2.5/drivers/i2c/busses/i2c-piix4.c      2003-11-29 17:29:55.000000000 +0000
2030 @@ -22,7 +22,7 @@
2031  /*
2032     Supports:
2033         Intel PIIX4, 440MX
2034 -       Serverworks OSB4, CSB5
2035 +       Serverworks OSB4, CSB5, CSB6
2036         SMSC Victory66
2037  
2038     Note: we assume there can only be one device, with one SMBus interface.
2039 @@ -423,6 +423,13 @@ static struct pci_device_id piix4_ids[] 
2040                 .driver_data =  0,
2041         },
2042         {
2043 +               .vendor =       PCI_VENDOR_ID_SERVERWORKS,
2044 +               .device =       PCI_DEVICE_ID_SERVERWORKS_CSB6,
2045 +               .subvendor =    PCI_ANY_ID,
2046 +               .subdevice =    PCI_ANY_ID,
2047 +               .driver_data =  0,
2048 +       },
2049 +       {
2050                 .vendor =       PCI_VENDOR_ID_INTEL,
2051                 .device =       PCI_DEVICE_ID_INTEL_82443MX_3,
2052                 .subvendor =    PCI_ANY_ID,
2053 diff -purN linux-2.5/drivers/i2c/busses/i2c-savage4.c usb-2.5/drivers/i2c/busses/i2c-savage4.c
2054 --- linux-2.5/drivers/i2c/busses/i2c-savage4.c  2003-09-23 12:20:12.000000000 +0000
2055 +++ usb-2.5/drivers/i2c/busses/i2c-savage4.c    2003-11-28 20:40:24.000000000 +0000
2056 @@ -1,13 +1,11 @@
2057  /*
2058      i2c-savage4.c - Part of lm_sensors, Linux kernel modules for hardware
2059                monitoring
2060 -    Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl>,
2061 -    Philip Edelbrock <phil@netroedge.com>,
2062 -    Ralph Metzler <rjkm@thp.uni-koeln.de>, and
2063 +    Copyright (C) 1998-2003  The LM Sensors Team
2064 +    Alexander Wold <awold@bigfoot.com>
2065      Mark D. Studebaker <mdsxyz123@yahoo.com>
2066      
2067 -    Based on code written by Ralph Metzler <rjkm@thp.uni-koeln.de> and
2068 -    Simon Vogl
2069 +    Based on i2c-voodoo3.c.
2070  
2071      This program is free software; you can redistribute it and/or modify
2072      it under the terms of the GNU General Public License as published by
2073 @@ -195,9 +193,7 @@ static void __exit i2c_savage4_exit(void
2074         pci_unregister_driver(&savage4_driver);
2075  }
2076  
2077 -MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, "
2078 -               "Philip Edelbrock <phil@netroedge.com>, "
2079 -               "Ralph Metzler <rjkm@thp.uni-koeln.de>, "
2080 +MODULE_AUTHOR("Alexander Wold <awold@bigfoot.com> "
2081                 "and Mark D. Studebaker <mdsxyz123@yahoo.com>");
2082  MODULE_DESCRIPTION("Savage4 I2C/SMBus driver");
2083  MODULE_LICENSE("GPL");
2084 diff -purN linux-2.5/drivers/i2c/busses/i2c-viapro.c usb-2.5/drivers/i2c/busses/i2c-viapro.c
2085 --- linux-2.5/drivers/i2c/busses/i2c-viapro.c   2003-09-12 16:55:09.000000000 +0000
2086 +++ usb-2.5/drivers/i2c/busses/i2c-viapro.c     2003-11-29 17:02:37.000000000 +0000
2087 @@ -29,6 +29,7 @@
2088         8233
2089         8233A (0x3147 and 0x3177)
2090         8235
2091 +       8237
2092     Note: we assume there can only be one device, with one SMBus interface.
2093  */
2094  
2095 @@ -436,6 +437,13 @@ static struct pci_device_id vt596_ids[] 
2096         },
2097         {
2098                 .vendor         = PCI_VENDOR_ID_VIA,
2099 +               .device         = PCI_DEVICE_ID_VIA_8237,
2100 +               .subvendor      = PCI_ANY_ID,
2101 +               .subdevice      = PCI_ANY_ID,
2102 +               .driver_data    = SMBBA3
2103 +       },
2104 +       {
2105 +               .vendor         = PCI_VENDOR_ID_VIA,
2106                 .device         = PCI_DEVICE_ID_VIA_8231_4,
2107                 .subvendor      = PCI_ANY_ID,
2108                 .subdevice      = PCI_ANY_ID,
2109 diff -purN linux-2.5/drivers/i2c/chips/Kconfig usb-2.5/drivers/i2c/chips/Kconfig
2110 --- linux-2.5/drivers/i2c/chips/Kconfig 2003-10-03 19:38:36.000000000 +0000
2111 +++ usb-2.5/drivers/i2c/chips/Kconfig   2003-10-17 16:35:41.000000000 +0000
2112 @@ -68,6 +68,17 @@ config SENSORS_LM78
2113           This driver can also be built as a module.  If so, the module
2114           will be called lm78.
2115  
2116 +config SENSORS_LM83
2117 +       tristate "National Semiconductor LM83"
2118 +       depends on I2C && EXPERIMENTAL
2119 +       select I2C_SENSOR
2120 +       help
2121 +         If you say yes here you get support for National Semiconductor
2122 +         LM83 sensor chips.
2123 +
2124 +         This driver can also be built as a module.  If so, the module
2125 +         will be called lm83.
2126 +
2127  config SENSORS_LM85
2128         tristate "National Semiconductor LM85 and compatibles"
2129         depends on I2C && EXPERIMENTAL
2130 @@ -99,7 +110,12 @@ config SENSORS_W83781D
2131           of sensor chips: the W83781D, W83782D, W83783S and W83682HF,
2132           and the similar Asus AS99127F.
2133           
2134 -         This driver can also be built as a module.  If so, the module
2135 -         will be called w83781d.
2136 +
2137 +
2138 +config SENSORS_SMBUS_ARP
2139 +       tristate "SMBus ARP 2.0 support"
2140 +       depends on I2C && EXPERIMENTAL
2141 +       select I2C_SENSOR
2142 +         
2143  
2144  endmenu
2145 diff -purN linux-2.5/drivers/i2c/chips/Makefile usb-2.5/drivers/i2c/chips/Makefile
2146 --- linux-2.5/drivers/i2c/chips/Makefile        2003-09-23 16:14:19.000000000 +0000
2147 +++ usb-2.5/drivers/i2c/chips/Makefile  2003-09-28 17:52:41.000000000 +0000
2148 @@ -10,5 +10,10 @@ obj-$(CONFIG_SENSORS_EEPROM) += eeprom.o
2149  obj-$(CONFIG_SENSORS_IT87)     += it87.o
2150  obj-$(CONFIG_SENSORS_LM75)     += lm75.o
2151  obj-$(CONFIG_SENSORS_LM78)     += lm78.o
2152 +obj-$(CONFIG_SENSORS_LM83)     += lm83.o
2153  obj-$(CONFIG_SENSORS_LM85)     += lm85.o
2154  obj-$(CONFIG_SENSORS_VIA686A)  += via686a.o
2155 +
2156 +
2157 +
2158 +obj-$(CONFIG_SENSORS_SMBUS_ARP)        += smbus-arp.o
2159 diff -purN linux-2.5/drivers/i2c/chips/it87.c usb-2.5/drivers/i2c/chips/it87.c
2160 --- linux-2.5/drivers/i2c/chips/it87.c  2003-10-04 13:45:29.000000000 +0000
2161 +++ usb-2.5/drivers/i2c/chips/it87.c    2003-11-21 21:22:20.000000000 +0000
2162 @@ -343,7 +343,6 @@ static ssize_t show_temp(struct device *
2163         it87_update_client(client);
2164         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[nr])*100 );
2165  }
2166 -/* more like overshoot temperature */
2167  static ssize_t show_temp_max(struct device *dev, char *buf, int nr)
2168  {
2169         struct i2c_client *client = to_i2c_client(dev);
2170 @@ -351,7 +350,6 @@ static ssize_t show_temp_max(struct devi
2171         it87_update_client(client);
2172         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_high[nr])*100);
2173  }
2174 -/* more like hysteresis temperature */
2175  static ssize_t show_temp_min(struct device *dev, char *buf, int nr)
2176  {
2177         struct i2c_client *client = to_i2c_client(dev);
2178 @@ -414,7 +412,6 @@ show_temp_offset(1);
2179  show_temp_offset(2);
2180  show_temp_offset(3);
2181  
2182 -/* more like overshoot temperature */
2183  static ssize_t show_sensor(struct device *dev, char *buf, int nr)
2184  {
2185         struct i2c_client *client = to_i2c_client(dev);
2186 @@ -563,15 +560,15 @@ show_fan_offset(1);
2187  show_fan_offset(2);
2188  show_fan_offset(3);
2189  
2190 -/* Alarm */
2191 -static ssize_t show_alarm(struct device *dev, char *buf)
2192 +/* Alarms */
2193 +static ssize_t show_alarms(struct device *dev, char *buf)
2194  {
2195         struct i2c_client *client = to_i2c_client(dev);
2196         struct it87_data *data = i2c_get_clientdata(client);
2197         it87_update_client(client);
2198         return sprintf(buf,"%d\n", ALARMS_FROM_REG(data->alarms));
2199  }
2200 -static DEVICE_ATTR(alarm, S_IRUGO | S_IWUSR, show_alarm, NULL);
2201 +static DEVICE_ATTR(alarms, S_IRUGO | S_IWUSR, show_alarms, NULL);
2202  
2203  /* This function is called when:
2204       * it87_driver is inserted (when this module is loaded), for each
2205 @@ -751,7 +748,7 @@ int it87_detect(struct i2c_adapter *adap
2206         device_create_file(&new_client->dev, &dev_attr_fan_div1);
2207         device_create_file(&new_client->dev, &dev_attr_fan_div2);
2208         device_create_file(&new_client->dev, &dev_attr_fan_div3);
2209 -       device_create_file(&new_client->dev, &dev_attr_alarm);
2210 +       device_create_file(&new_client->dev, &dev_attr_alarms);
2211  
2212         return 0;
2213  
2214 diff -purN linux-2.5/drivers/i2c/chips/lm75.c usb-2.5/drivers/i2c/chips/lm75.c
2215 --- linux-2.5/drivers/i2c/chips/lm75.c  2003-10-04 13:45:05.000000000 +0000
2216 +++ usb-2.5/drivers/i2c/chips/lm75.c    2003-11-16 18:24:37.000000000 +0000
2217 @@ -116,7 +116,7 @@ set(temp_max, LM75_REG_TEMP_OS);
2218  set(temp_hyst, LM75_REG_TEMP_HYST);
2219  
2220  static DEVICE_ATTR(temp_max, S_IWUSR | S_IRUGO, show_temp_max, set_temp_max);
2221 -static DEVICE_ATTR(temp_min, S_IWUSR | S_IRUGO, show_temp_hyst, set_temp_hyst);
2222 +static DEVICE_ATTR(temp_hyst, S_IWUSR | S_IRUGO, show_temp_hyst, set_temp_hyst);
2223  static DEVICE_ATTR(temp_input, S_IRUGO, show_temp_input, NULL);
2224  
2225  static int lm75_attach_adapter(struct i2c_adapter *adapter)
2226 @@ -209,7 +209,7 @@ static int lm75_detect(struct i2c_adapte
2227         
2228         /* Register sysfs hooks */
2229         device_create_file(&new_client->dev, &dev_attr_temp_max);
2230 -       device_create_file(&new_client->dev, &dev_attr_temp_min);
2231 +       device_create_file(&new_client->dev, &dev_attr_temp_hyst);
2232         device_create_file(&new_client->dev, &dev_attr_temp_input);
2233  
2234         return 0;
2235 diff -purN linux-2.5/drivers/i2c/chips/lm78.c usb-2.5/drivers/i2c/chips/lm78.c
2236 --- linux-2.5/drivers/i2c/chips/lm78.c  2003-10-04 13:44:29.000000000 +0000
2237 +++ usb-2.5/drivers/i2c/chips/lm78.c    2003-11-16 18:30:19.000000000 +0000
2238 @@ -367,7 +367,7 @@ static ssize_t set_temp_hyst(struct devi
2239  static DEVICE_ATTR(temp_input, S_IRUGO, show_temp, NULL)
2240  static DEVICE_ATTR(temp_max, S_IRUGO | S_IWUSR,
2241                 show_temp_over, set_temp_over)
2242 -static DEVICE_ATTR(temp_min, S_IRUGO | S_IWUSR,
2243 +static DEVICE_ATTR(temp_hyst, S_IRUGO | S_IWUSR,
2244                 show_temp_hyst, set_temp_hyst)
2245  
2246  /* 3 Fans */
2247 @@ -674,8 +674,8 @@ int lm78_detect(struct i2c_adapter *adap
2248         device_create_file(&new_client->dev, &dev_attr_in_min6);
2249         device_create_file(&new_client->dev, &dev_attr_in_max6);
2250         device_create_file(&new_client->dev, &dev_attr_temp_input);
2251 -       device_create_file(&new_client->dev, &dev_attr_temp_min);
2252         device_create_file(&new_client->dev, &dev_attr_temp_max);
2253 +       device_create_file(&new_client->dev, &dev_attr_temp_hyst);
2254         device_create_file(&new_client->dev, &dev_attr_fan_input1);
2255         device_create_file(&new_client->dev, &dev_attr_fan_min1);
2256         device_create_file(&new_client->dev, &dev_attr_fan_div1);
2257 diff -purN linux-2.5/drivers/i2c/chips/lm83.c usb-2.5/drivers/i2c/chips/lm83.c
2258 --- linux-2.5/drivers/i2c/chips/lm83.c  1970-01-01 00:00:00.000000000 +0000
2259 +++ usb-2.5/drivers/i2c/chips/lm83.c    2003-10-04 15:05:41.000000000 +0000
2260 @@ -0,0 +1,413 @@
2261 +/*
2262 + * lm83.c - Part of lm_sensors, Linux kernel modules for hardware
2263 + *          monitoring
2264 + * Copyright (C) 2003  Jean Delvare <khali@linux-fr.org>
2265 + *
2266 + * Heavily inspired from the lm78, lm75 and adm1021 drivers. The LM83 is
2267 + * a sensor chip made by National Semiconductor. It reports up to four
2268 + * temperatures (its own plus up to three external ones) with a 1 deg
2269 + * resolution and a 3-4 deg accuracy. Complete datasheet can be obtained
2270 + * from National's website at:
2271 + *   http://www.national.com/pf/LM/LM83.html
2272 + * Since the datasheet omits to give the chip stepping code, I give it
2273 + * here: 0x03 (at register 0xff).
2274 + *
2275 + * This program is free software; you can redistribute it and/or modify
2276 + * it under the terms of the GNU General Public License as published by
2277 + * the Free Software Foundation; either version 2 of the License, or
2278 + * (at your option) any later version.
2279 + *
2280 + * This program is distributed in the hope that it will be useful,
2281 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
2282 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2283 + * GNU General Public License for more details.
2284 + *
2285 + * You should have received a copy of the GNU General Public License
2286 + * along with this program; if not, write to the Free Software
2287 + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
2288 + */
2289 +
2290 +#include <linux/module.h>
2291 +#include <linux/init.h>
2292 +#include <linux/slab.h>
2293 +#include <linux/i2c.h>
2294 +#include <linux/i2c-sensor.h>
2295 +
2296 +/*
2297 + * Addresses to scan
2298 + * Address is selected using 2 three-level pins, resulting in 9 possible
2299 + * addresses.
2300 + */
2301 +
2302 +static unsigned short normal_i2c[] = { I2C_CLIENT_END };
2303 +static unsigned short normal_i2c_range[] = { 0x18, 0x1a, 0x29, 0x2b,
2304 +    0x4c, 0x4e, I2C_CLIENT_END };
2305 +static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END };
2306 +static unsigned int normal_isa_range[] = { I2C_CLIENT_ISA_END };
2307 +
2308 +/*
2309 + * Insmod parameters
2310 + */
2311 +
2312 +SENSORS_INSMOD_1(lm83);
2313 +
2314 +/*
2315 + * The LM83 registers
2316 + * Manufacturer ID is 0x01 for National Semiconductor.
2317 + */
2318 +
2319 +#define LM83_REG_R_MAN_ID              0xFE
2320 +#define LM83_REG_R_CHIP_ID             0xFF
2321 +#define LM83_REG_R_CONFIG              0x03
2322 +#define LM83_REG_W_CONFIG              0x09
2323 +#define LM83_REG_R_STATUS1             0x02
2324 +#define LM83_REG_R_STATUS2             0x35
2325 +#define LM83_REG_R_LOCAL_TEMP          0x00
2326 +#define LM83_REG_R_LOCAL_HIGH          0x05
2327 +#define LM83_REG_W_LOCAL_HIGH          0x0B
2328 +#define LM83_REG_R_REMOTE1_TEMP                0x30
2329 +#define LM83_REG_R_REMOTE1_HIGH                0x38
2330 +#define LM83_REG_W_REMOTE1_HIGH                0x50
2331 +#define LM83_REG_R_REMOTE2_TEMP                0x01
2332 +#define LM83_REG_R_REMOTE2_HIGH                0x07
2333 +#define LM83_REG_W_REMOTE2_HIGH                0x0D
2334 +#define LM83_REG_R_REMOTE3_TEMP                0x31
2335 +#define LM83_REG_R_REMOTE3_HIGH                0x3A
2336 +#define LM83_REG_W_REMOTE3_HIGH                0x52
2337 +#define LM83_REG_R_TCRIT               0x42
2338 +#define LM83_REG_W_TCRIT               0x5A
2339 +
2340 +/*
2341 + * Conversions, initial values and various macros
2342 + * The LM83 uses signed 8-bit values.
2343 + */
2344 +
2345 +#define TEMP_FROM_REG(val)     ((val > 127 ? val-256 : val) * 1000)
2346 +#define TEMP_TO_REG(val)       ((val < 0 ? val+256 : val) / 1000)
2347 +
2348 +#define LM83_INIT_HIGH         100
2349 +#define LM83_INIT_CRIT         120
2350 +
2351 +static const u8 LM83_REG_R_TEMP[] = {
2352 +       LM83_REG_R_LOCAL_TEMP,
2353 +       LM83_REG_R_REMOTE1_TEMP,
2354 +       LM83_REG_R_REMOTE2_TEMP,
2355 +       LM83_REG_R_REMOTE3_TEMP
2356 +};
2357 +
2358 +static const u8 LM83_REG_R_HIGH[] = {
2359 +       LM83_REG_R_LOCAL_HIGH,
2360 +       LM83_REG_R_REMOTE1_HIGH,
2361 +       LM83_REG_R_REMOTE2_HIGH,
2362 +       LM83_REG_R_REMOTE3_HIGH
2363 +};
2364 +
2365 +static const u8 LM83_REG_W_HIGH[] = {
2366 +       LM83_REG_W_LOCAL_HIGH,
2367 +       LM83_REG_W_REMOTE1_HIGH,
2368 +       LM83_REG_W_REMOTE2_HIGH,
2369 +       LM83_REG_W_REMOTE3_HIGH
2370 +};
2371 +
2372 +/*
2373 + * Functions declaration
2374 + */
2375 +
2376 +static int lm83_attach_adapter(struct i2c_adapter *adapter);
2377 +static int lm83_detect(struct i2c_adapter *adapter, int address,
2378 +    int kind);
2379 +static void lm83_init_client(struct i2c_client *client);
2380 +static int lm83_detach_client(struct i2c_client *client);
2381 +static void lm83_update_client(struct i2c_client *client);
2382 +
2383 +/*
2384 + * Driver data (common to all clients)
2385 + */
2386
2387 +static struct i2c_driver lm83_driver = {
2388 +       .owner          = THIS_MODULE,
2389 +       .name           = "lm83",
2390 +       .id             = I2C_DRIVERID_LM83,
2391 +       .flags          = I2C_DF_NOTIFY,
2392 +       .attach_adapter = lm83_attach_adapter,
2393 +       .detach_client  = lm83_detach_client,
2394 +};
2395 +
2396 +/*
2397 + * Client data (each client gets its own)
2398 + */
2399 +
2400 +struct lm83_data
2401 +{
2402 +       struct semaphore update_lock;
2403 +       char valid; /* zero until following fields are valid */
2404 +       unsigned long last_updated; /* in jiffies */
2405 +
2406 +       /* registers values */
2407 +       u8 temp_input[4];
2408 +       u8 temp_high[4];
2409 +       u8 temp_crit;
2410 +       u16 alarms; /* bitvector, combined */
2411 +};
2412 +
2413 +/*
2414 + * Internal variables
2415 + */
2416 +
2417 +static int lm83_id = 0;
2418 +
2419 +/*
2420 + * Sysfs stuff
2421 + */
2422 +
2423 +#define show_temp(suffix, value) \
2424 +static ssize_t show_temp_##suffix(struct device *dev, char *buf) \
2425 +{ \
2426 +       struct i2c_client *client = to_i2c_client(dev); \
2427 +       struct lm83_data *data = i2c_get_clientdata(client); \
2428 +       lm83_update_client(client); \
2429 +       return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \
2430 +}
2431 +show_temp(input1, temp_input[0]);
2432 +show_temp(input2, temp_input[1]);
2433 +show_temp(input3, temp_input[2]);
2434 +show_temp(input4, temp_input[3]);
2435 +show_temp(high1, temp_high[0]);
2436 +show_temp(high2, temp_high[1]);
2437 +show_temp(high3, temp_high[2]);
2438 +show_temp(high4, temp_high[3]);
2439 +show_temp(crit, temp_crit);
2440 +
2441 +#define set_temp(suffix, value, reg) \
2442 +static ssize_t set_temp_##suffix(struct device *dev, const char *buf, \
2443 +       size_t count) \
2444 +{ \
2445 +       struct i2c_client *client = to_i2c_client(dev); \
2446 +       struct lm83_data *data = i2c_get_clientdata(client); \
2447 +       data->value = TEMP_TO_REG(simple_strtoul(buf, NULL, 10)); \
2448 +       i2c_smbus_write_byte_data(client, reg, data->value); \
2449 +       return count; \
2450 +}
2451 +set_temp(high1, temp_high[0], LM83_REG_W_LOCAL_HIGH);
2452 +set_temp(high2, temp_high[1], LM83_REG_W_REMOTE1_HIGH);
2453 +set_temp(high3, temp_high[2], LM83_REG_W_REMOTE2_HIGH);
2454 +set_temp(high4, temp_high[3], LM83_REG_W_REMOTE3_HIGH);
2455 +set_temp(crit, temp_crit, LM83_REG_W_TCRIT);
2456 +
2457 +static ssize_t show_alarms(struct device *dev, char *buf)
2458 +{
2459 +       struct i2c_client *client = to_i2c_client(dev);
2460 +       struct lm83_data *data = i2c_get_clientdata(client);
2461 +       lm83_update_client(client);
2462 +       return sprintf(buf, "%d\n", data->alarms);
2463 +}
2464 +
2465 +static DEVICE_ATTR(temp_input1, S_IRUGO, show_temp_input1, NULL);
2466 +static DEVICE_ATTR(temp_input2, S_IRUGO, show_temp_input2, NULL);
2467 +static DEVICE_ATTR(temp_input3, S_IRUGO, show_temp_input3, NULL);
2468 +static DEVICE_ATTR(temp_input4, S_IRUGO, show_temp_input4, NULL);
2469 +static DEVICE_ATTR(temp_max1, S_IWUSR | S_IRUGO, show_temp_high1,
2470 +    set_temp_high1);
2471 +static DEVICE_ATTR(temp_max2, S_IWUSR | S_IRUGO, show_temp_high2,
2472 +    set_temp_high2);
2473 +static DEVICE_ATTR(temp_max3, S_IWUSR | S_IRUGO, show_temp_high3,
2474 +    set_temp_high3);
2475 +static DEVICE_ATTR(temp_max4, S_IWUSR | S_IRUGO, show_temp_high4,
2476 +    set_temp_high4);
2477 +static DEVICE_ATTR(temp_crit, S_IWUSR | S_IRUGO, show_temp_crit,
2478 +    set_temp_crit);
2479 +static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
2480 +
2481 +/*
2482 + * Real code
2483 + */
2484 +
2485 +static int lm83_attach_adapter(struct i2c_adapter *adapter)
2486 +{
2487 +       if (!(adapter->class & I2C_ADAP_CLASS_SMBUS))
2488 +               return 0;
2489 +       return i2c_detect(adapter, &addr_data, lm83_detect);
2490 +}
2491 +
2492 +/*
2493 + * The following function does more than just detection. If detection
2494 + * succeeds, it also registers the new chip.
2495 + */
2496 +static int lm83_detect(struct i2c_adapter *adapter, int address,
2497 +    int kind)
2498 +{
2499 +       struct i2c_client *new_client;
2500 +       struct lm83_data *data;
2501 +       int err = 0;
2502 +       const char *name = "";
2503 +
2504 +       if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
2505 +               goto exit;
2506 +
2507 +       if (!(new_client = kmalloc(sizeof(struct i2c_client) +
2508 +           sizeof(struct lm83_data), GFP_KERNEL))) {
2509 +               err = -ENOMEM;
2510 +               goto exit;
2511 +       }
2512 +       memset(new_client, 0x00, sizeof(struct i2c_client) +
2513 +           sizeof(struct lm83_data));
2514 +
2515 +       /* The LM83-specific data is placed right after the common I2C
2516 +        * client data. */
2517 +       data = (struct lm83_data *) (new_client + 1);
2518 +       i2c_set_clientdata(new_client, data);
2519 +       new_client->addr = address;
2520 +       new_client->adapter = adapter;
2521 +       new_client->driver = &lm83_driver;
2522 +       new_client->flags = 0;
2523 +
2524 +       /* Now we do the detection and identification. A negative kind
2525 +        * means that the driver was loaded with no force parameter
2526 +        * (default), so we must both detect and identify the chip
2527 +        * (actually there is only one possible kind of chip for now, LM83).
2528 +        * A zero kind means that the driver was loaded with the force
2529 +        * parameter, the detection step shall be skipped. A positive kind
2530 +        * means that the driver was loaded with the force parameter and a
2531 +        * given kind of chip is requested, so both the detection and the
2532 +        * identification steps are skipped. */
2533 +       if (kind < 0) { /* detection */
2534 +               if (((i2c_smbus_read_byte_data(new_client, LM83_REG_R_STATUS1)
2535 +                   & 0xA8) != 0x00) ||
2536 +                   ((i2c_smbus_read_byte_data(new_client, LM83_REG_R_STATUS2)
2537 +                   & 0x48) != 0x00) ||
2538 +                   ((i2c_smbus_read_byte_data(new_client, LM83_REG_R_CONFIG)
2539 +                   & 0x41) != 0x00)) {
2540 +                       dev_dbg(&client->dev,
2541 +                           "LM83 detection failed at 0x%02x.\n", address);
2542 +                       goto exit_free;
2543 +               }
2544 +       }
2545 +
2546 +       if (kind <= 0) { /* identification */
2547 +               u8 man_id, chip_id;
2548 +
2549 +               man_id = i2c_smbus_read_byte_data(new_client,
2550 +                   LM83_REG_R_MAN_ID);
2551 +               chip_id = i2c_smbus_read_byte_data(new_client,
2552 +                   LM83_REG_R_CHIP_ID);
2553 +               if (man_id == 0x01) { /* National Semiconductor */
2554 +                       if (chip_id == 0x03) {
2555 +                               kind = lm83;
2556 +                               name = "lm83";
2557 +                       }
2558 +               }
2559 +
2560 +               if (kind <= 0) { /* identification failed */
2561 +                       dev_info(&adapter->dev,
2562 +                           "Unsupported chip (man_id=0x%02X, "
2563 +                           "chip_id=0x%02X).\n", man_id, chip_id);
2564 +                       goto exit_free;
2565 +               }
2566 +       }
2567 +
2568 +       /* We can fill in the remaining client fields */
2569 +       strlcpy(new_client->name, name, I2C_NAME_SIZE);
2570 +       new_client->id = lm83_id++;
2571 +       data->valid = 0;
2572 +       init_MUTEX(&data->update_lock);
2573 +
2574 +       /* Tell the I2C layer a new client has arrived */
2575 +       if ((err = i2c_attach_client(new_client)))
2576 +               goto exit_free;
2577 +
2578 +       /* Initialize the LM83 chip */
2579 +       lm83_init_client(new_client);
2580 +
2581 +       /* Register sysfs hooks */
2582 +       device_create_file(&new_client->dev, &dev_attr_temp_input1);
2583 +       device_create_file(&new_client->dev, &dev_attr_temp_input2);
2584 +       device_create_file(&new_client->dev, &dev_attr_temp_input3);
2585 +       device_create_file(&new_client->dev, &dev_attr_temp_input4);
2586 +       device_create_file(&new_client->dev, &dev_attr_temp_max1);
2587 +       device_create_file(&new_client->dev, &dev_attr_temp_max2);
2588 +       device_create_file(&new_client->dev, &dev_attr_temp_max3);
2589 +       device_create_file(&new_client->dev, &dev_attr_temp_max4);
2590 +       device_create_file(&new_client->dev, &dev_attr_temp_crit);
2591 +       device_create_file(&new_client->dev, &dev_attr_alarms);
2592 +
2593 +       return 0;
2594 +
2595 +exit_free:
2596 +       kfree(new_client);
2597 +exit:
2598 +       return err;
2599 +}
2600 +
2601 +static void lm83_init_client(struct i2c_client *client)
2602 +{
2603 +       int nr;
2604 +
2605 +       for (nr = 0; nr < 4; nr++)
2606 +               i2c_smbus_write_byte_data(client, LM83_REG_W_HIGH[nr],
2607 +                   TEMP_TO_REG(LM83_INIT_HIGH));
2608 +       i2c_smbus_write_byte_data(client, LM83_REG_W_TCRIT,
2609 +           TEMP_TO_REG(LM83_INIT_CRIT));
2610 +}
2611 +
2612 +static int lm83_detach_client(struct i2c_client *client)
2613 +{
2614 +       int err;
2615 +
2616 +       if ((err = i2c_detach_client(client))) {
2617 +               dev_err(&client->dev,
2618 +                   "Client deregistration failed, client not detached.\n");
2619 +               return err;
2620 +       }
2621 +
2622 +       kfree(client);
2623 +       return 0;
2624 +}
2625 +
2626 +static void lm83_update_client(struct i2c_client *client)
2627 +{
2628 +       struct lm83_data *data = i2c_get_clientdata(client);
2629 +
2630 +       down(&data->update_lock);
2631 +
2632 +       if ((jiffies - data->last_updated > HZ * 2) ||
2633 +           (jiffies < data->last_updated) ||
2634 +           !data->valid) {
2635 +               int nr;
2636 +               dev_dbg(&client->dev, "Updating lm83 data.\n");
2637 +               for (nr = 0; nr < 4 ; nr++) {
2638 +                       data->temp_input[nr] =
2639 +                           i2c_smbus_read_byte_data(client,
2640 +                           LM83_REG_R_TEMP[nr]);
2641 +                       data->temp_high[nr] =
2642 +                           i2c_smbus_read_byte_data(client,
2643 +                           LM83_REG_R_HIGH[nr]);
2644 +               }
2645 +               data->temp_crit =
2646 +                   i2c_smbus_read_byte_data(client, LM83_REG_R_TCRIT);
2647 +               data->alarms =
2648 +                   i2c_smbus_read_byte_data(client, LM83_REG_R_STATUS1)
2649 +                   + (i2c_smbus_read_byte_data(client, LM83_REG_R_STATUS2)
2650 +                   << 8);
2651 +               data->last_updated = jiffies;
2652 +               data->valid = 1;
2653 +       }
2654 +
2655 +       up(&data->update_lock);
2656 +}
2657 +
2658 +static int __init sensors_lm83_init(void)
2659 +{
2660 +       return i2c_add_driver(&lm83_driver);
2661 +}
2662 +
2663 +static void __exit sensors_lm83_exit(void)
2664 +{
2665 +       i2c_del_driver(&lm83_driver);
2666 +}
2667 +
2668 +MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>");
2669 +MODULE_DESCRIPTION("LM83 driver");
2670 +MODULE_LICENSE("GPL");
2671 +
2672 +module_init(sensors_lm83_init);
2673 +module_exit(sensors_lm83_exit);
2674 diff -purN linux-2.5/drivers/i2c/chips/lm85.c usb-2.5/drivers/i2c/chips/lm85.c
2675 --- linux-2.5/drivers/i2c/chips/lm85.c  2003-10-04 13:43:13.000000000 +0000
2676 +++ usb-2.5/drivers/i2c/chips/lm85.c    2003-10-17 16:35:42.000000000 +0000
2677 @@ -433,14 +433,11 @@ static ssize_t set_fan_min(struct device
2678                 size_t count, int nr)
2679  {
2680         struct i2c_client *client = to_i2c_client(dev);
2681 -       struct lm85_data *data = i2c_get_clientdata(client);
2682         int     val;
2683  
2684 -       down(&data->update_lock);
2685         val = simple_strtol(buf, NULL, 10);
2686 -       data->fan_min[nr] = FAN_TO_REG(val);
2687 -       lm85_write_value(client, LM85_REG_FAN_MIN(nr), data->fan_min[nr]);
2688 -       up(&data->update_lock);
2689 +       val = FAN_TO_REG(val);
2690 +       lm85_write_value(client, LM85_REG_FAN_MIN(nr), val);
2691         return count;
2692  }
2693  
2694 @@ -527,14 +524,11 @@ static ssize_t set_pwm(struct device *de
2695                 size_t count, int nr)
2696  {
2697         struct i2c_client *client = to_i2c_client(dev);
2698 -       struct lm85_data *data = i2c_get_clientdata(client);
2699         int     val;
2700  
2701 -       down(&data->update_lock);
2702         val = simple_strtol(buf, NULL, 10);
2703 -       data->pwm[nr] = PWM_TO_REG(val);
2704 -       lm85_write_value(client, LM85_REG_PWM(nr), data->pwm[nr]);
2705 -       up(&data->update_lock);
2706 +       val = PWM_TO_REG(val);
2707 +       lm85_write_value(client, LM85_REG_PWM(nr), val);
2708         return count;
2709  }
2710  static ssize_t show_pwm_enable(struct device *dev, char *buf, int nr)
2711 @@ -592,14 +586,11 @@ static ssize_t set_in_min(struct device 
2712                 size_t count, int nr)
2713  {
2714         struct i2c_client *client = to_i2c_client(dev);
2715 -       struct lm85_data *data = i2c_get_clientdata(client);
2716         int     val;
2717  
2718 -       down(&data->update_lock);
2719         val = simple_strtol(buf, NULL, 10);
2720 -       data->in_min[nr] = INS_TO_REG(nr, val);
2721 -       lm85_write_value(client, LM85_REG_IN_MIN(nr), data->in_min[nr]);
2722 -       up(&data->update_lock);
2723 +       val = INS_TO_REG(nr, val);
2724 +       lm85_write_value(client, LM85_REG_IN_MIN(nr), val);
2725         return count;
2726  }
2727  static ssize_t show_in_max(struct device *dev, char *buf, int nr)
2728 @@ -614,14 +605,11 @@ static ssize_t set_in_max(struct device 
2729                 size_t count, int nr)
2730  {
2731         struct i2c_client *client = to_i2c_client(dev);
2732 -       struct lm85_data *data = i2c_get_clientdata(client);
2733         int     val;
2734  
2735 -       down(&data->update_lock);
2736         val = simple_strtol(buf, NULL, 10);
2737 -       data->in_max[nr] = INS_TO_REG(nr, val);
2738 -       lm85_write_value(client, LM85_REG_IN_MAX(nr), data->in_max[nr]);
2739 -       up(&data->update_lock);
2740 +       val = INS_TO_REG(nr, val);
2741 +       lm85_write_value(client, LM85_REG_IN_MAX(nr), val);