8f62e16c7a377f8ea79862acf31124c277d08488
[safe/jmp/linux-2.6] / drivers / staging / meilhaus / medevice.c
1 /**
2  * @file medevice.c
3  *
4  * @brief Meilhaus device base class.
5  * @note Copyright (C) 2007 Meilhaus Electronic GmbH (support@meilhaus.de)
6  * @author Guenter Gebhardt
7  * @author Krzysztof Gantzke    (k.gantzke@meilhaus.de)
8  */
9
10 /*
11  * Copyright (C) 2007 Meilhaus Electronic GmbH (support@meilhaus.de)
12  *
13  * This file is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26  */
27
28 #include "mecommon.h"
29 #include "meinternal.h"
30 #include "medefines.h"
31 #include "meerror.h"
32
33 #include "medebug.h"
34 #include "medevice.h"
35
36 #ifndef __KERNEL__
37 #  define __KERNEL__
38 #endif
39
40 static int me_device_io_irq_start(struct me_device *device,
41                                   struct file *filep,
42                                   int subdevice,
43                                   int channel,
44                                   int irq_source,
45                                   int irq_edge, int irq_arg, int flags)
46 {
47         int err = ME_ERRNO_SUCCESS;
48         me_subdevice_t *s;
49
50         PDEBUG("executed.\n");
51
52         // Check subdevice index.
53         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
54                 PERROR("Invalid subdevice.\n");
55                 return ME_ERRNO_INVALID_SUBDEVICE;
56         }
57         // Enter device.
58         err = me_dlock_enter(&device->dlock, filep);
59
60         if (err) {
61                 PERROR("Cannot enter device.\n");
62                 return err;
63         }
64         // Get subdevice instance.
65         s = me_slist_get_subdevice(&device->slist, subdevice);
66
67         if (s) {
68                 // Call subdevice method.
69                 err = s->me_subdevice_io_irq_start(s,
70                                                    filep,
71                                                    channel,
72                                                    irq_source,
73                                                    irq_edge, irq_arg, flags);
74         } else {
75                 // Something really bad happened.
76                 PERROR("Cannot get subdevice instance.\n");
77                 err = ME_ERRNO_INTERNAL;
78         }
79
80         // Exit device.
81         me_dlock_exit(&device->dlock, filep);
82
83         return err;
84 }
85
86 static int me_device_io_irq_wait(struct me_device *device,
87                                  struct file *filep,
88                                  int subdevice,
89                                  int channel,
90                                  int *irq_count,
91                                  int *value, int time_out, int flags)
92 {
93         int err = ME_ERRNO_SUCCESS;
94         me_subdevice_t *s;
95
96         PDEBUG("executed.\n");
97
98         // Check subdevice index.
99         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
100                 PERROR("Invalid subdevice.\n");
101                 return ME_ERRNO_INVALID_SUBDEVICE;
102         }
103         // Enter device.
104         err = me_dlock_enter(&device->dlock, filep);
105
106         if (err) {
107                 PERROR("Cannot enter device.\n");
108                 return err;
109         }
110         // Get subdevice instance.
111         s = me_slist_get_subdevice(&device->slist, subdevice);
112
113         if (s) {
114                 // Call subdevice method.
115                 err = s->me_subdevice_io_irq_wait(s,
116                                                   filep,
117                                                   channel,
118                                                   irq_count,
119                                                   value, time_out, flags);
120         } else {
121                 // Something really bad happened.
122                 PERROR("Cannot get subdevice instance.\n");
123                 err = ME_ERRNO_INTERNAL;
124         }
125
126         // Exit device.
127         me_dlock_exit(&device->dlock, filep);
128
129         return err;
130 }
131
132 static int me_device_io_irq_stop(struct me_device *device,
133                                  struct file *filep,
134                                  int subdevice, int channel, int flags)
135 {
136         int err = ME_ERRNO_SUCCESS;
137         me_subdevice_t *s;
138
139         PDEBUG("executed.\n");
140
141         // Check subdevice index.
142         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
143                 PERROR("Invalid subdevice.\n");
144                 return ME_ERRNO_INVALID_SUBDEVICE;
145         }
146         // Enter device.
147         err = me_dlock_enter(&device->dlock, filep);
148
149         if (err) {
150                 PERROR("Cannot enter device.\n");
151                 return err;
152         }
153         // Get subdevice instance.
154         s = me_slist_get_subdevice(&device->slist, subdevice);
155
156         if (s) {
157                 // Call subdevice method.
158                 err = s->me_subdevice_io_irq_stop(s, filep, channel, flags);
159         } else {
160                 // Something really bad happened.
161                 PERROR("Cannot get subdevice instance.\n");
162                 err = ME_ERRNO_INTERNAL;
163         }
164
165         // Exit device.
166         me_dlock_exit(&device->dlock, filep);
167
168         return err;
169 }
170
171 static int me_device_io_reset_device(struct me_device *device,
172                                      struct file *filep, int flags)
173 {
174         int err = ME_ERRNO_SUCCESS;
175         me_subdevice_t *s;
176         int i, n;
177
178         PDEBUG("executed.\n");
179
180         /* Get the number of subdevices. */
181         n = me_slist_get_number_subdevices(&device->slist);
182
183         // Enter device.
184         err = me_dlock_enter(&device->dlock, filep);
185
186         if (err) {
187                 PERROR("Cannot enter device.\n");
188                 return err;
189         }
190
191         /* Reset every subdevice in list. */
192         for (i = 0; i < n; i++) {
193                 s = me_slist_get_subdevice(&device->slist, i);
194                 err = s->me_subdevice_io_reset_subdevice(s, filep, flags);
195
196                 if (err) {
197                         PERROR("Cannot reset subdevice.\n");
198                         break;
199                 }
200         }
201
202         // Exit device.
203         me_dlock_exit(&device->dlock, filep);
204
205         return err;
206 }
207
208 static int me_device_io_reset_subdevice(struct me_device *device,
209                                         struct file *filep,
210                                         int subdevice, int flags)
211 {
212         int err = ME_ERRNO_SUCCESS;
213         me_subdevice_t *s;
214
215         PDEBUG("executed.\n");
216
217         // Check subdevice index.
218
219         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
220                 PERROR("Invalid subdevice.\n");
221                 return ME_ERRNO_INVALID_SUBDEVICE;
222         }
223         // Enter device.
224         err = me_dlock_enter(&device->dlock, filep);
225
226         if (err) {
227                 PERROR("Cannot enter device.\n");
228                 return err;
229         }
230         // Get subdevice instance.
231         s = me_slist_get_subdevice(&device->slist, subdevice);
232
233         if (s) {
234                 // Call subdevice method.
235                 err = s->me_subdevice_io_reset_subdevice(s, filep, flags);
236         } else {
237                 // Something really bad happened.
238                 PERROR("Cannot get subdevice instance.\n");
239                 err = ME_ERRNO_INTERNAL;
240         }
241
242         // Exit device.
243         me_dlock_exit(&device->dlock, filep);
244
245         return err;
246 }
247
248 static int me_device_io_single_config(struct me_device *device,
249                                       struct file *filep,
250                                       int subdevice,
251                                       int channel,
252                                       int single_config,
253                                       int ref,
254                                       int trig_chan,
255                                       int trig_type, int trig_edge, int flags)
256 {
257         int err = ME_ERRNO_SUCCESS;
258         me_subdevice_t *s;
259
260         PDEBUG("executed.\n");
261
262         // Check subdevice index.
263
264         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
265                 PERROR("Invalid subdevice.\n");
266                 return ME_ERRNO_INVALID_SUBDEVICE;
267         }
268         // Enter device.
269         err = me_dlock_enter(&device->dlock, filep);
270
271         if (err) {
272                 PERROR("Cannot enter device.\n");
273                 return err;
274         }
275         // Get subdevice instance.
276         s = me_slist_get_subdevice(&device->slist, subdevice);
277
278         if (s) {
279                 // Call subdevice method.
280                 err = s->me_subdevice_io_single_config(s,
281                                                        filep,
282                                                        channel,
283                                                        single_config,
284                                                        ref,
285                                                        trig_chan,
286                                                        trig_type,
287                                                        trig_edge, flags);
288         } else {
289                 // Something really bad happened.
290                 PERROR("Cannot get subdevice instance.\n");
291                 err = ME_ERRNO_INTERNAL;
292         }
293
294         // Exit device.
295         me_dlock_exit(&device->dlock, filep);
296
297         return err;
298 }
299
300 static int me_device_io_single_read(struct me_device *device,
301                                     struct file *filep,
302                                     int subdevice,
303                                     int channel,
304                                     int *value, int time_out, int flags)
305 {
306         int err = ME_ERRNO_SUCCESS;
307         me_subdevice_t *s;
308
309         PDEBUG("executed.\n");
310
311         // Check subdevice index.
312
313         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
314                 PERROR("Invalid subdevice.\n");
315                 return ME_ERRNO_INVALID_SUBDEVICE;
316         }
317         // Enter device.
318         err = me_dlock_enter(&device->dlock, filep);
319
320         if (err) {
321                 PERROR("Cannot enter device.\n");
322                 return err;
323         }
324         // Get subdevice instance.
325         s = me_slist_get_subdevice(&device->slist, subdevice);
326
327         if (s) {
328                 // Call subdevice method.
329                 err = s->me_subdevice_io_single_read(s,
330                                                      filep,
331                                                      channel,
332                                                      value, time_out, flags);
333         } else {
334                 // Something really bad happened.
335                 PERROR("Cannot get subdevice instance.\n");
336                 err = ME_ERRNO_INTERNAL;
337         }
338
339         // Exit device.
340         me_dlock_exit(&device->dlock, filep);
341
342         return err;
343 }
344
345 static int me_device_io_single_write(struct me_device *device,
346                                      struct file *filep,
347                                      int subdevice,
348                                      int channel,
349                                      int value, int time_out, int flags)
350 {
351         int err = ME_ERRNO_SUCCESS;
352         me_subdevice_t *s;
353
354         PDEBUG("executed.\n");
355
356         // Check subdevice index.
357
358         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
359                 PERROR("Invalid subdevice.\n");
360                 return ME_ERRNO_INVALID_SUBDEVICE;
361         }
362         // Enter device.
363         err = me_dlock_enter(&device->dlock, filep);
364
365         if (err) {
366                 PERROR("Cannot enter device.\n");
367                 return err;
368         }
369         // Get subdevice instance.
370         s = me_slist_get_subdevice(&device->slist, subdevice);
371
372         if (s) {
373                 // Call subdevice method.
374                 err = s->me_subdevice_io_single_write(s,
375                                                       filep,
376                                                       channel,
377                                                       value, time_out, flags);
378         } else {
379                 // Something really bad happened.
380                 PERROR("Cannot get subdevice instance.\n");
381                 err = ME_ERRNO_INTERNAL;
382         }
383
384         // Exit device.
385         me_dlock_exit(&device->dlock, filep);
386
387         return err;
388 }
389
390 static int me_device_io_stream_config(struct me_device *device,
391                                       struct file *filep,
392                                       int subdevice,
393                                       meIOStreamConfig_t * config_list,
394                                       int count,
395                                       meIOStreamTrigger_t * trigger,
396                                       int fifo_irq_threshold, int flags)
397 {
398         int err = ME_ERRNO_SUCCESS;
399         me_subdevice_t *s;
400
401         PDEBUG("executed.\n");
402
403         // Check subdevice index.
404
405         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
406                 PERROR("Invalid subdevice.\n");
407                 return ME_ERRNO_INVALID_SUBDEVICE;
408         }
409         // Enter device.
410         err = me_dlock_enter(&device->dlock, filep);
411
412         if (err) {
413                 PERROR("Cannot enter device.\n");
414                 return err;
415         }
416         // Get subdevice instance.
417         s = me_slist_get_subdevice(&device->slist, subdevice);
418
419         if (s) {
420                 // Call subdevice method.
421                 err = s->me_subdevice_io_stream_config(s,
422                                                        filep,
423                                                        config_list,
424                                                        count,
425                                                        trigger,
426                                                        fifo_irq_threshold,
427                                                        flags);
428         } else {
429                 // Something really bad happened.
430                 PERROR("Cannot get subdevice instance.\n");
431                 err = ME_ERRNO_INTERNAL;
432         }
433
434         // Exit device.
435         me_dlock_exit(&device->dlock, filep);
436
437         return err;
438 }
439
440 static int me_device_io_stream_new_values(struct me_device *device,
441                                           struct file *filep,
442                                           int subdevice,
443                                           int time_out, int *count, int flags)
444 {
445         int err = ME_ERRNO_SUCCESS;
446         me_subdevice_t *s;
447
448         PDEBUG("executed.\n");
449
450         // Check subdevice index.
451
452         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
453                 PERROR("Invalid subdevice.\n");
454                 return ME_ERRNO_INVALID_SUBDEVICE;
455         }
456         // Enter device.
457         err = me_dlock_enter(&device->dlock, filep);
458
459         if (err) {
460                 PERROR("Cannot enter device.\n");
461                 return err;
462         }
463         // Get subdevice instance.
464         s = me_slist_get_subdevice(&device->slist, subdevice);
465
466         if (s) {
467                 // Call subdevice method.
468                 err = s->me_subdevice_io_stream_new_values(s,
469                                                            filep,
470                                                            time_out,
471                                                            count, flags);
472         } else {
473                 // Something really bad happened.
474                 PERROR("Cannot get subdevice instance.\n");
475                 err = ME_ERRNO_INTERNAL;
476         }
477
478         // Exit device.
479         me_dlock_exit(&device->dlock, filep);
480
481         return err;
482 }
483
484 static int me_device_io_stream_read(struct me_device *device,
485                                     struct file *filep,
486                                     int subdevice,
487                                     int read_mode,
488                                     int *values, int *count, int flags)
489 {
490         int err = ME_ERRNO_SUCCESS;
491         me_subdevice_t *s;
492
493         PDEBUG("executed.\n");
494
495         // Check subdevice index.
496
497         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
498                 PERROR("Invalid subdevice.\n");
499                 return ME_ERRNO_INVALID_SUBDEVICE;
500         }
501         // Enter device.
502         err = me_dlock_enter(&device->dlock, filep);
503
504         if (err) {
505                 PERROR("Cannot enter device.\n");
506                 return err;
507         }
508         // Get subdevice instance.
509         s = me_slist_get_subdevice(&device->slist, subdevice);
510
511         if (s) {
512                 // Call subdevice method.
513                 err = s->me_subdevice_io_stream_read(s,
514                                                      filep,
515                                                      read_mode,
516                                                      values, count, flags);
517         } else {
518                 // Something really bad happened.
519                 PERROR("Cannot get subdevice instance.\n");
520                 err = ME_ERRNO_INTERNAL;
521         }
522
523         // Exit device.
524         me_dlock_exit(&device->dlock, filep);
525
526         return err;
527 }
528
529 static int me_device_io_stream_start(struct me_device *device,
530                                      struct file *filep,
531                                      int subdevice,
532                                      int start_mode, int time_out, int flags)
533 {
534         int err = ME_ERRNO_SUCCESS;
535         me_subdevice_t *s;
536
537         PDEBUG("executed.\n");
538
539         // Check subdevice index.
540
541         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
542                 PERROR("Invalid subdevice.\n");
543                 return ME_ERRNO_INVALID_SUBDEVICE;
544         }
545         // Enter device.
546         err = me_dlock_enter(&device->dlock, filep);
547
548         if (err) {
549                 PERROR("Cannot enter device.\n");
550                 return err;
551         }
552         // Get subdevice instance.
553         s = me_slist_get_subdevice(&device->slist, subdevice);
554
555         if (s) {
556                 // Call subdevice method.
557                 err = s->me_subdevice_io_stream_start(s,
558                                                       filep,
559                                                       start_mode,
560                                                       time_out, flags);
561         } else {
562                 // Something really bad happened.
563                 PERROR("Cannot get subdevice instance.\n");
564                 err = ME_ERRNO_INTERNAL;
565         }
566
567         // Exit device.
568         me_dlock_exit(&device->dlock, filep);
569
570         return err;
571 }
572
573 static int me_device_io_stream_status(struct me_device *device,
574                                       struct file *filep,
575                                       int subdevice,
576                                       int wait,
577                                       int *status, int *count, int flags)
578 {
579         int err = ME_ERRNO_SUCCESS;
580         me_subdevice_t *s;
581
582         PDEBUG("executed.\n");
583
584         // Check subdevice index.
585
586         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
587                 PERROR("Invalid subdevice.\n");
588                 return ME_ERRNO_INVALID_SUBDEVICE;
589         }
590         // Enter device.
591         err = me_dlock_enter(&device->dlock, filep);
592
593         if (err) {
594                 PERROR("Cannot enter device.\n");
595                 return err;
596         }
597         // Get subdevice instance.
598         s = me_slist_get_subdevice(&device->slist, subdevice);
599
600         if (s) {
601                 // Call subdevice method.
602                 err = s->me_subdevice_io_stream_status(s,
603                                                        filep,
604                                                        wait,
605                                                        status, count, flags);
606         } else {
607                 // Something really bad happened.
608                 PERROR("Cannot get subdevice instance.\n");
609                 err = ME_ERRNO_INTERNAL;
610         }
611
612         // Exit device.
613         me_dlock_exit(&device->dlock, filep);
614
615         return err;
616 }
617
618 static int me_device_io_stream_stop(struct me_device *device,
619                                     struct file *filep,
620                                     int subdevice, int stop_mode, int flags)
621 {
622         int err = ME_ERRNO_SUCCESS;
623         me_subdevice_t *s;
624
625         PDEBUG("executed.\n");
626
627         // Check subdevice index.
628
629         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
630                 PERROR("Invalid subdevice.\n");
631                 return ME_ERRNO_INVALID_SUBDEVICE;
632         }
633         // Enter device.
634         err = me_dlock_enter(&device->dlock, filep);
635
636         if (err) {
637                 PERROR("Cannot enter device.\n");
638                 return err;
639         }
640         // Get subdevice instance.
641         s = me_slist_get_subdevice(&device->slist, subdevice);
642
643         if (s) {
644                 // Call subdevice method.
645                 err = s->me_subdevice_io_stream_stop(s,
646                                                      filep, stop_mode, flags);
647         } else {
648                 // Something really bad happened.
649                 PERROR("Cannot get subdevice instance.\n");
650                 err = ME_ERRNO_INTERNAL;
651         }
652
653         // Exit device.
654         me_dlock_exit(&device->dlock, filep);
655
656         return err;
657 }
658
659 static int me_device_io_stream_write(struct me_device *device,
660                                      struct file *filep,
661                                      int subdevice,
662                                      int write_mode,
663                                      int *values, int *count, int flags)
664 {
665         int err = ME_ERRNO_SUCCESS;
666         me_subdevice_t *s;
667
668         PDEBUG("executed.\n");
669
670         // Check subdevice index.
671
672         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
673                 PERROR("Invalid subdevice.\n");
674                 return ME_ERRNO_INVALID_SUBDEVICE;
675         }
676         // Enter device.
677         err = me_dlock_enter(&device->dlock, filep);
678
679         if (err) {
680                 PERROR("Cannot enter device.\n");
681                 return err;
682         }
683         // Get subdevice instance.
684         s = me_slist_get_subdevice(&device->slist, subdevice);
685
686         if (s) {
687                 // Call subdevice method.
688                 err = s->me_subdevice_io_stream_write(s,
689                                                       filep,
690                                                       write_mode,
691                                                       values, count, flags);
692         } else {
693                 // Something really bad happened.
694                 PERROR("Cannot get subdevice instance.\n");
695                 err = ME_ERRNO_INTERNAL;
696         }
697
698         // Exit device.
699         me_dlock_exit(&device->dlock, filep);
700
701         return err;
702 }
703
704 static int me_device_lock_device(struct me_device *device,
705                                  struct file *filep, int lock, int flags)
706 {
707         PDEBUG("executed.\n");
708
709         return me_dlock_lock(&device->dlock,
710                              filep, lock, flags, &device->slist);
711 }
712
713 static int me_device_lock_subdevice(struct me_device *device,
714                                     struct file *filep,
715                                     int subdevice, int lock, int flags)
716 {
717         int err = ME_ERRNO_SUCCESS;
718         me_subdevice_t *s;
719
720         PDEBUG("executed.\n");
721
722         // Check subdevice index.
723
724         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
725                 PERROR("Invalid subdevice.\n");
726                 return ME_ERRNO_INVALID_SUBDEVICE;
727         }
728         // Enter device.
729         err = me_dlock_enter(&device->dlock, filep);
730
731         if (err) {
732                 PERROR("Cannot enter device.\n");
733                 return err;
734         }
735         // Get subdevice instance.
736         s = me_slist_get_subdevice(&device->slist, subdevice);
737
738         if (s) {
739                 // Call subdevice method.
740                 err = s->me_subdevice_lock_subdevice(s, filep, lock, flags);
741         } else {
742                 // Something really bad happened.
743                 PERROR("Cannot get subdevice instance.\n");
744                 err = ME_ERRNO_INTERNAL;
745         }
746
747         // Exit device.
748         me_dlock_exit(&device->dlock, filep);
749
750         return err;
751 }
752
753 static int me_device_query_description_device(struct me_device *device,
754                                               char **description)
755 {
756         PDEBUG("executed.\n");
757         *description = device->device_description;
758         return ME_ERRNO_SUCCESS;
759 }
760
761 static int me_device_query_info_device(struct me_device *device,
762                                        int *vendor_id,
763                                        int *device_id,
764                                        int *serial_no,
765                                        int *bus_type,
766                                        int *bus_no,
767                                        int *dev_no, int *func_no, int *plugged)
768 {
769         PDEBUG("executed.\n");
770
771         if (device->bus_type == ME_BUS_TYPE_PCI) {
772                 *vendor_id = device->info.pci.vendor_id;
773                 *device_id = device->info.pci.device_id;
774                 *serial_no = device->info.pci.serial_no;
775                 *bus_type = ME_BUS_TYPE_PCI;
776                 *bus_no = device->info.pci.pci_bus_no;
777                 *dev_no = device->info.pci.pci_dev_no;
778                 *func_no = device->info.pci.pci_func_no;
779                 *plugged = ME_PLUGGED_IN;
780         } else {
781                 *plugged = ME_PLUGGED_OUT;
782         }
783         return ME_ERRNO_SUCCESS;
784 }
785
786 static int me_device_query_name_device(struct me_device *device, char **name)
787 {
788         PDEBUG("executed.\n");
789         *name = device->device_name;
790         return ME_ERRNO_SUCCESS;
791 }
792
793 static int me_device_query_name_device_driver(struct me_device *device,
794                                               char **name)
795 {
796         PDEBUG("executed.\n");
797         *name = device->driver_name;
798         return ME_ERRNO_SUCCESS;
799 }
800
801 static int me_device_query_number_subdevices(struct me_device *device,
802                                              int *number)
803 {
804         PDEBUG("executed.\n");
805         return me_slist_query_number_subdevices(&device->slist, number);
806 }
807
808 static int me_device_query_number_channels(struct me_device *device,
809                                            int subdevice, int *number)
810 {
811         int err = ME_ERRNO_SUCCESS;
812         me_subdevice_t *s;
813
814         PDEBUG("executed.\n");
815
816         // Check subdevice index.
817
818         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
819                 PERROR("Invalid subdevice.\n");
820                 return ME_ERRNO_INVALID_SUBDEVICE;
821         }
822         // Get subdevice instance.
823         s = me_slist_get_subdevice(&device->slist, subdevice);
824
825         if (s) {
826                 // Call subdevice method.
827                 err = s->me_subdevice_query_number_channels(s, number);
828         } else {
829                 // Something really bad happened.
830                 PERROR("Cannot get subdevice instance.\n");
831                 err = ME_ERRNO_INTERNAL;
832         }
833
834         return err;
835 }
836
837 static int me_device_query_number_ranges(struct me_device *device,
838                                          int subdevice, int unit, int *count)
839 {
840         int err = ME_ERRNO_SUCCESS;
841         me_subdevice_t *s;
842
843         PDEBUG("executed.\n");
844
845         // Check subdevice index.
846
847         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
848                 PERROR("Invalid subdevice.\n");
849                 return ME_ERRNO_INVALID_SUBDEVICE;
850         }
851         // Get subdevice instance.
852         s = me_slist_get_subdevice(&device->slist, subdevice);
853
854         if (s) {
855                 // Call subdevice method.
856                 err = s->me_subdevice_query_number_ranges(s, unit, count);
857         } else {
858                 // Something really bad happened.
859                 PERROR("Cannot get subdevice instance.\n");
860                 err = ME_ERRNO_INTERNAL;
861         }
862
863         return err;
864 }
865
866 static int me_device_query_range_by_min_max(struct me_device *device,
867                                             int subdevice,
868                                             int unit,
869                                             int *min,
870                                             int *max, int *maxdata, int *range)
871 {
872         int err = ME_ERRNO_SUCCESS;
873         me_subdevice_t *s;
874
875         PDEBUG("executed.\n");
876
877         // Check subdevice index.
878
879         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
880                 PERROR("Invalid subdevice.\n");
881                 return ME_ERRNO_INVALID_SUBDEVICE;
882         }
883         // Get subdevice instance.
884         s = me_slist_get_subdevice(&device->slist, subdevice);
885
886         if (s) {
887                 // Call subdevice method.
888                 err = s->me_subdevice_query_range_by_min_max(s,
889                                                              unit,
890                                                              min,
891                                                              max,
892                                                              maxdata, range);
893         } else {
894                 // Something really bad happened.
895                 PERROR("Cannot get subdevice instance.\n");
896                 err = ME_ERRNO_INTERNAL;
897         }
898
899         return err;
900 }
901
902 static int me_device_query_range_info(struct me_device *device,
903                                       int subdevice,
904                                       int range,
905                                       int *unit,
906                                       int *min, int *max, int *maxdata)
907 {
908         int err = ME_ERRNO_SUCCESS;
909         me_subdevice_t *s;
910
911         PDEBUG("executed.\n");
912
913         // Check subdevice index.
914
915         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
916                 PERROR("Invalid subdevice.\n");
917                 return ME_ERRNO_INVALID_SUBDEVICE;
918         }
919         // Get subdevice instance.
920         s = me_slist_get_subdevice(&device->slist, subdevice);
921
922         if (s) {
923                 // Call subdevice method.
924                 err = s->me_subdevice_query_range_info(s,
925                                                        range,
926                                                        unit, min, max, maxdata);
927         } else {
928                 // Something really bad happened.
929                 PERROR("Cannot get subdevice instance.\n");
930                 err = ME_ERRNO_INTERNAL;
931         }
932
933         return err;
934 }
935
936 static int me_device_query_subdevice_by_type(struct me_device *device,
937                                              int start_subdevice,
938                                              int type,
939                                              int subtype, int *subdevice)
940 {
941         PDEBUG("executed.\n");
942
943         return me_slist_get_subdevice_by_type(&device->slist,
944                                               start_subdevice,
945                                               type, subtype, subdevice);
946 }
947
948 static int me_device_query_subdevice_type(struct me_device *device,
949                                           int subdevice,
950                                           int *type, int *subtype)
951 {
952         int err = ME_ERRNO_SUCCESS;
953         me_subdevice_t *s;
954
955         PDEBUG("executed.\n");
956
957         // Check subdevice index.
958
959         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
960                 PERROR("Invalid subdevice.\n");
961                 return ME_ERRNO_INVALID_SUBDEVICE;
962         }
963         // Get subdevice instance.
964         s = me_slist_get_subdevice(&device->slist, subdevice);
965
966         if (s) {
967                 // Call subdevice method.
968                 err = s->me_subdevice_query_subdevice_type(s, type, subtype);
969         } else {
970                 // Something really bad happened.
971                 PERROR("Cannot get subdevice instance.\n");
972                 err = ME_ERRNO_INTERNAL;
973         }
974
975         return err;
976 }
977
978 static int me_device_query_subdevice_caps(struct me_device *device,
979                                           int subdevice, int *caps)
980 {
981         int err = ME_ERRNO_SUCCESS;
982         me_subdevice_t *s;
983
984         PDEBUG("executed.\n");
985
986         // Check subdevice index.
987
988         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
989                 PERROR("Invalid subdevice.\n");
990                 return ME_ERRNO_INVALID_SUBDEVICE;
991         }
992         // Get subdevice instance.
993         s = me_slist_get_subdevice(&device->slist, subdevice);
994
995         if (s) {
996                 // Call subdevice method.
997                 err = s->me_subdevice_query_subdevice_caps(s, caps);
998         } else {
999                 // Something really bad happened.
1000                 PERROR("Cannot get subdevice instance.\n");
1001                 err = ME_ERRNO_INTERNAL;
1002         }
1003
1004         return err;
1005 }
1006
1007 static int me_device_query_subdevice_caps_args(struct me_device *device,
1008                                                int subdevice,
1009                                                int cap, int *args, int count)
1010 {
1011         int err = ME_ERRNO_SUCCESS;
1012         me_subdevice_t *s;
1013
1014         PDEBUG("executed.\n");
1015
1016         // Check subdevice index.
1017
1018         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
1019                 PERROR("Invalid subdevice.\n");
1020                 return ME_ERRNO_INVALID_SUBDEVICE;
1021         }
1022         // Get subdevice instance.
1023         s = me_slist_get_subdevice(&device->slist, subdevice);
1024
1025         if (s) {
1026                 // Call subdevice method.
1027                 err = s->me_subdevice_query_subdevice_caps_args(s,
1028                                                                 cap,
1029                                                                 args, count);
1030         } else {
1031                 // Something really bad happened.
1032                 PERROR("Cannot get subdevice instance.\n");
1033                 err = ME_ERRNO_INTERNAL;
1034         }
1035
1036         return err;
1037 }
1038
1039 static int me_device_query_timer(struct me_device *device,
1040                                  int subdevice,
1041                                  int timer,
1042                                  int *base_frequency,
1043                                  uint64_t * min_ticks, uint64_t * max_ticks)
1044 {
1045         int err = ME_ERRNO_SUCCESS;
1046         me_subdevice_t *s;
1047
1048         PDEBUG("executed.\n");
1049
1050         // Check subdevice index.
1051
1052         if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
1053                 PERROR("Invalid subdevice.\n");
1054                 return ME_ERRNO_INVALID_SUBDEVICE;
1055         }
1056         // Get subdevice instance.
1057         s = me_slist_get_subdevice(&device->slist, subdevice);
1058
1059         if (s) {
1060                 // Call subdevice method.
1061                 err = s->me_subdevice_query_timer(s,
1062                                                   timer,
1063                                                   base_frequency,
1064                                                   min_ticks, max_ticks);
1065         } else {
1066                 // Something really bad happened.
1067                 PERROR("Cannot get subdevice instance.\n");
1068                 err = ME_ERRNO_INTERNAL;
1069         }
1070
1071         return err;
1072 }
1073
1074 static int me_device_query_version_device_driver(struct me_device *device,
1075                                                  int *version)
1076 /** @todo Versions shold be read from driver. I must overwrite this function in each module. Here should be returned an error!
1077 */
1078 {
1079         PDEBUG("executed.\n");
1080         *version = ME_VERSION_DRIVER;
1081         return ME_ERRNO_SUCCESS;
1082 }
1083
1084 static int me_device_config_load(struct me_device *device, struct file *filep,
1085                                  me_cfg_device_entry_t * config)
1086 {
1087         PDEBUG("executed.\n");
1088         return ME_ERRNO_SUCCESS;        //If no need for config return success.
1089 //      return ME_ERRNO_NOT_SUPPORTED;
1090 }
1091
1092 static void me_device_destructor(me_device_t * me_device)
1093 {
1094         PDEBUG("executed.\n");
1095         me_device_deinit(me_device);
1096         kfree(me_device);
1097 }
1098
1099 /* //me_device_usb_init
1100 int me_device_usb_init(me_device_t *me_device, struct usb_interface *interface)
1101 {
1102         PDEBUG("executed.\n");
1103         return -1;
1104 }
1105 */
1106
1107 static int get_device_descriptions(uint16_t device_id,
1108                                    char **device_name,
1109                                    char **device_description,
1110                                    char **driver_name)
1111 /** @todo This is wrong concept! Static table has too strong limitations!
1112 * 'device_name' and 'driver_name' should be calculated from 'device_id'
1113 * 'device_description' should be read from device or moved to user space and handled by library!
1114 */
1115 {
1116         PDEBUG("executed.\n");
1117
1118         switch (device_id) {
1119         case PCI_DEVICE_ID_MEILHAUS_ME1000:
1120         case PCI_DEVICE_ID_MEILHAUS_ME1000_A:
1121         case PCI_DEVICE_ID_MEILHAUS_ME1000_B:
1122                 *device_name = ME1000_NAME_DEVICE_ME1000;
1123                 *device_description = ME1000_DESCRIPTION_DEVICE_ME1000;
1124                 *driver_name = ME1000_NAME_DRIVER;
1125                 break;
1126
1127         case PCI_DEVICE_ID_MEILHAUS_ME1400:
1128                 *device_name = ME1400_NAME_DEVICE_ME1400;
1129                 *device_description = ME1400_DESCRIPTION_DEVICE_ME1400;
1130                 *driver_name = ME1400_NAME_DRIVER;
1131                 break;
1132
1133         case PCI_DEVICE_ID_MEILHAUS_ME140A:
1134                 *device_name = ME1400_NAME_DEVICE_ME1400A;
1135                 *device_description = ME1400_DESCRIPTION_DEVICE_ME1400A;
1136                 *driver_name = ME1400_NAME_DRIVER;
1137                 break;
1138
1139         case PCI_DEVICE_ID_MEILHAUS_ME140B:
1140                 *device_name = ME1400_NAME_DEVICE_ME1400B;
1141                 *device_description = ME1400_DESCRIPTION_DEVICE_ME1400B;
1142                 *driver_name = ME1400_NAME_DRIVER;
1143                 break;
1144
1145         case PCI_DEVICE_ID_MEILHAUS_ME14E0:
1146                 *device_name = ME1400_NAME_DEVICE_ME1400E;
1147                 *device_description = ME1400_DESCRIPTION_DEVICE_ME1400E;
1148                 *driver_name = ME1400_NAME_DRIVER;
1149                 break;
1150
1151         case PCI_DEVICE_ID_MEILHAUS_ME14EA:
1152                 *device_name = ME1400_NAME_DEVICE_ME1400EA;
1153                 *device_description = ME1400_DESCRIPTION_DEVICE_ME1400EA;
1154                 *driver_name = ME1400_NAME_DRIVER;
1155                 break;
1156
1157         case PCI_DEVICE_ID_MEILHAUS_ME14EB:
1158                 *device_name = ME1400_NAME_DEVICE_ME1400EB;
1159                 *device_description = ME1400_DESCRIPTION_DEVICE_ME1400EB;
1160                 *driver_name = ME1400_NAME_DRIVER;
1161                 break;
1162
1163         case PCI_DEVICE_ID_MEILHAUS_ME140C:
1164                 *device_name = ME1400_NAME_DEVICE_ME1400C;
1165                 *device_description = ME1400_DESCRIPTION_DEVICE_ME1400C;
1166                 *driver_name = ME1400_NAME_DRIVER;
1167                 break;
1168
1169         case PCI_DEVICE_ID_MEILHAUS_ME140D:
1170                 *device_name = ME1400_NAME_DEVICE_ME1400D;
1171                 *device_description = ME1400_DESCRIPTION_DEVICE_ME1400D;
1172                 *driver_name = ME1400_NAME_DRIVER;
1173                 break;
1174
1175         case PCI_DEVICE_ID_MEILHAUS_ME1600_4U:
1176                 *device_name = ME1600_NAME_DEVICE_ME16004U;
1177                 *device_description = ME1600_DESCRIPTION_DEVICE_ME16004U;
1178                 *driver_name = ME1600_NAME_DRIVER;
1179                 break;
1180
1181         case PCI_DEVICE_ID_MEILHAUS_ME1600_8U:
1182                 *device_name = ME1600_NAME_DEVICE_ME16008U;
1183                 *device_description = ME1600_DESCRIPTION_DEVICE_ME16008U;
1184                 *driver_name = ME1600_NAME_DRIVER;
1185                 break;
1186
1187         case PCI_DEVICE_ID_MEILHAUS_ME1600_12U:
1188                 *device_name = ME1600_NAME_DEVICE_ME160012U;
1189                 *device_description = ME1600_DESCRIPTION_DEVICE_ME160012U;
1190                 *driver_name = ME1600_NAME_DRIVER;
1191                 break;
1192
1193         case PCI_DEVICE_ID_MEILHAUS_ME1600_16U:
1194                 *device_name = ME1600_NAME_DEVICE_ME160016U;
1195                 *device_description = ME1600_DESCRIPTION_DEVICE_ME160016U;
1196                 *driver_name = ME1600_NAME_DRIVER;
1197                 break;
1198
1199         case PCI_DEVICE_ID_MEILHAUS_ME1600_16U_8I:
1200                 *device_name = ME1600_NAME_DEVICE_ME160016U8I;
1201                 *device_description = ME1600_DESCRIPTION_DEVICE_ME160016U8I;
1202                 *driver_name = ME1600_NAME_DRIVER;
1203                 break;
1204
1205         case PCI_DEVICE_ID_MEILHAUS_ME4610:
1206                 *device_name = ME4600_NAME_DEVICE_ME4610;
1207                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4610;
1208                 *driver_name = ME4600_NAME_DRIVER;
1209                 break;
1210
1211         case PCI_DEVICE_ID_MEILHAUS_ME4650:
1212                 *device_name = ME4600_NAME_DEVICE_ME4650;
1213                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4650;
1214                 *driver_name = ME4600_NAME_DRIVER;
1215                 break;
1216
1217         case PCI_DEVICE_ID_MEILHAUS_ME4660:
1218                 *device_name = ME4600_NAME_DEVICE_ME4660;
1219                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4660;
1220                 *driver_name = ME4600_NAME_DRIVER;
1221                 break;
1222
1223         case PCI_DEVICE_ID_MEILHAUS_ME4660I:
1224                 *device_name = ME4600_NAME_DEVICE_ME4660I;
1225                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4660I;
1226                 *driver_name = ME4600_NAME_DRIVER;
1227                 break;
1228
1229         case PCI_DEVICE_ID_MEILHAUS_ME4660S:
1230                 *device_name = ME4600_NAME_DEVICE_ME4660S;
1231                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4660S;
1232                 *driver_name = ME4600_NAME_DRIVER;
1233                 break;
1234
1235         case PCI_DEVICE_ID_MEILHAUS_ME4660IS:
1236                 *device_name = ME4600_NAME_DEVICE_ME4660IS;
1237                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4660IS;
1238                 *driver_name = ME4600_NAME_DRIVER;
1239                 break;
1240
1241         case PCI_DEVICE_ID_MEILHAUS_ME4670:
1242                 *device_name = ME4600_NAME_DEVICE_ME4670;
1243                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4670;
1244                 *driver_name = ME4600_NAME_DRIVER;
1245                 break;
1246
1247         case PCI_DEVICE_ID_MEILHAUS_ME4670I:
1248                 *device_name = ME4600_NAME_DEVICE_ME4670I;
1249                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4670I;
1250                 *driver_name = ME4600_NAME_DRIVER;
1251                 break;
1252
1253         case PCI_DEVICE_ID_MEILHAUS_ME4670S:
1254                 *device_name = ME4600_NAME_DEVICE_ME4670S;
1255                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4670S;
1256                 *driver_name = ME4600_NAME_DRIVER;
1257                 break;
1258
1259         case PCI_DEVICE_ID_MEILHAUS_ME4670IS:
1260                 *device_name = ME4600_NAME_DEVICE_ME4670IS;
1261                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4670IS;
1262                 *driver_name = ME4600_NAME_DRIVER;
1263                 break;
1264
1265         case PCI_DEVICE_ID_MEILHAUS_ME4680:
1266                 *device_name = ME4600_NAME_DEVICE_ME4680;
1267                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4680;
1268                 *driver_name = ME4600_NAME_DRIVER;
1269                 break;
1270
1271         case PCI_DEVICE_ID_MEILHAUS_ME4680I:
1272                 *device_name = ME4600_NAME_DEVICE_ME4680I;
1273                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4680I;
1274                 *driver_name = ME4600_NAME_DRIVER;
1275                 break;
1276
1277         case PCI_DEVICE_ID_MEILHAUS_ME4680S:
1278                 *device_name = ME4600_NAME_DEVICE_ME4680S;
1279                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4680S;
1280                 *driver_name = ME4600_NAME_DRIVER;
1281                 break;
1282
1283         case PCI_DEVICE_ID_MEILHAUS_ME4680IS:
1284                 *device_name = ME4600_NAME_DEVICE_ME4680IS;
1285                 *device_description = ME4600_DESCRIPTION_DEVICE_ME4680IS;
1286                 *driver_name = ME4600_NAME_DRIVER;
1287                 break;
1288
1289         case PCI_DEVICE_ID_MEILHAUS_ME6004:
1290                 *device_name = ME6000_NAME_DEVICE_ME60004;
1291                 *device_description = ME6000_DESCRIPTION_DEVICE_ME60004;
1292                 *driver_name = ME6000_NAME_DRIVER;
1293                 break;
1294
1295         case PCI_DEVICE_ID_MEILHAUS_ME6008:
1296                 *device_name = ME6000_NAME_DEVICE_ME60008;
1297                 *device_description = ME6000_DESCRIPTION_DEVICE_ME60008;
1298                 *driver_name = ME6000_NAME_DRIVER;
1299                 break;
1300
1301         case PCI_DEVICE_ID_MEILHAUS_ME600F:
1302                 *device_name = ME6000_NAME_DEVICE_ME600016;
1303                 *device_description = ME6000_DESCRIPTION_DEVICE_ME600016;
1304                 *driver_name = ME6000_NAME_DRIVER;
1305                 break;
1306
1307         case PCI_DEVICE_ID_MEILHAUS_ME6014:
1308                 *device_name = ME6000_NAME_DEVICE_ME6000I4;
1309                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I4;
1310                 *driver_name = ME6000_NAME_DRIVER;
1311                 break;
1312
1313         case PCI_DEVICE_ID_MEILHAUS_ME6018:
1314                 *device_name = ME6000_NAME_DEVICE_ME6000I8;
1315                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I8;
1316                 *driver_name = ME6000_NAME_DRIVER;
1317                 break;
1318
1319         case PCI_DEVICE_ID_MEILHAUS_ME601F:
1320                 *device_name = ME6000_NAME_DEVICE_ME6000I16;
1321                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I16;
1322                 *driver_name = ME6000_NAME_DRIVER;
1323                 break;
1324
1325         case PCI_DEVICE_ID_MEILHAUS_ME6034:
1326                 *device_name = ME6000_NAME_DEVICE_ME6000ISLE4;
1327                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE4;
1328                 *driver_name = ME6000_NAME_DRIVER;
1329                 break;
1330
1331         case PCI_DEVICE_ID_MEILHAUS_ME6038:
1332                 *device_name = ME6000_NAME_DEVICE_ME6000ISLE8;
1333                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE8;
1334                 *driver_name = ME6000_NAME_DRIVER;
1335                 break;
1336
1337         case PCI_DEVICE_ID_MEILHAUS_ME603F:
1338                 *device_name = ME6000_NAME_DEVICE_ME6000ISLE16;
1339                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE16;
1340                 *driver_name = ME6000_NAME_DRIVER;
1341                 break;
1342
1343         case PCI_DEVICE_ID_MEILHAUS_ME6104:
1344                 *device_name = ME6000_NAME_DEVICE_ME61004;
1345                 *device_description = ME6000_DESCRIPTION_DEVICE_ME61004;
1346                 *driver_name = ME6000_NAME_DRIVER;
1347                 break;
1348
1349         case PCI_DEVICE_ID_MEILHAUS_ME6108:
1350                 *device_name = ME6000_NAME_DEVICE_ME61008;
1351                 *device_description = ME6000_DESCRIPTION_DEVICE_ME61008;
1352                 *driver_name = ME6000_NAME_DRIVER;
1353                 break;
1354
1355         case PCI_DEVICE_ID_MEILHAUS_ME610F:
1356                 *device_name = ME6000_NAME_DEVICE_ME610016;
1357                 *device_description = ME6000_DESCRIPTION_DEVICE_ME610016;
1358                 *driver_name = ME6000_NAME_DRIVER;
1359                 break;
1360
1361         case PCI_DEVICE_ID_MEILHAUS_ME6114:
1362                 *device_name = ME6000_NAME_DEVICE_ME6100I4;
1363                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I4;
1364                 *driver_name = ME6000_NAME_DRIVER;
1365                 break;
1366
1367         case PCI_DEVICE_ID_MEILHAUS_ME6118:
1368                 *device_name = ME6000_NAME_DEVICE_ME6100I8;
1369                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I8;
1370                 *driver_name = ME6000_NAME_DRIVER;
1371                 break;
1372
1373         case PCI_DEVICE_ID_MEILHAUS_ME611F:
1374                 *device_name = ME6000_NAME_DEVICE_ME6100I16;
1375                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I16;
1376                 *driver_name = ME6000_NAME_DRIVER;
1377                 break;
1378
1379         case PCI_DEVICE_ID_MEILHAUS_ME6134:
1380                 *device_name = ME6000_NAME_DEVICE_ME6100ISLE4;
1381                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE4;
1382                 *driver_name = ME6000_NAME_DRIVER;
1383                 break;
1384
1385         case PCI_DEVICE_ID_MEILHAUS_ME6138:
1386                 *device_name = ME6000_NAME_DEVICE_ME6100ISLE8;
1387                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE8;
1388                 *driver_name = ME6000_NAME_DRIVER;
1389                 break;
1390
1391         case PCI_DEVICE_ID_MEILHAUS_ME613F:
1392                 *device_name = ME6000_NAME_DEVICE_ME6100ISLE16;
1393                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE16;
1394                 *driver_name = ME6000_NAME_DRIVER;
1395                 break;
1396
1397         case PCI_DEVICE_ID_MEILHAUS_ME6044:
1398                 *device_name = ME6000_NAME_DEVICE_ME60004DIO;
1399                 *device_description = ME6000_DESCRIPTION_DEVICE_ME60004DIO;
1400                 *driver_name = ME6000_NAME_DRIVER;
1401                 break;
1402
1403         case PCI_DEVICE_ID_MEILHAUS_ME6048:
1404                 *device_name = ME6000_NAME_DEVICE_ME60008DIO;
1405                 *device_description = ME6000_DESCRIPTION_DEVICE_ME60008DIO;
1406                 *driver_name = ME6000_NAME_DRIVER;
1407                 break;
1408
1409         case PCI_DEVICE_ID_MEILHAUS_ME604F:
1410                 *device_name = ME6000_NAME_DEVICE_ME600016DIO;
1411                 *device_description = ME6000_DESCRIPTION_DEVICE_ME600016DIO;
1412                 *driver_name = ME6000_NAME_DRIVER;
1413                 break;
1414
1415         case PCI_DEVICE_ID_MEILHAUS_ME6054:
1416                 *device_name = ME6000_NAME_DEVICE_ME6000I4DIO;
1417                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I4DIO;
1418                 *driver_name = ME6000_NAME_DRIVER;
1419                 break;
1420
1421         case PCI_DEVICE_ID_MEILHAUS_ME6058:
1422                 *device_name = ME6000_NAME_DEVICE_ME6000I8DIO;
1423                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I8DIO;
1424                 *driver_name = ME6000_NAME_DRIVER;
1425                 break;
1426
1427         case PCI_DEVICE_ID_MEILHAUS_ME605F:
1428                 *device_name = ME6000_NAME_DEVICE_ME6000I16DIO;
1429                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I16DIO;
1430                 *driver_name = ME6000_NAME_DRIVER;
1431                 break;
1432
1433         case PCI_DEVICE_ID_MEILHAUS_ME6074:
1434                 *device_name = ME6000_NAME_DEVICE_ME6000ISLE4DIO;
1435                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE4DIO;
1436                 *driver_name = ME6000_NAME_DRIVER;
1437                 break;
1438
1439         case PCI_DEVICE_ID_MEILHAUS_ME6078:
1440                 *device_name = ME6000_NAME_DEVICE_ME6000ISLE8DIO;
1441                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE8DIO;
1442                 *driver_name = ME6000_NAME_DRIVER;
1443                 break;
1444
1445         case PCI_DEVICE_ID_MEILHAUS_ME607F:
1446                 *device_name = ME6000_NAME_DEVICE_ME6000ISLE16DIO;
1447                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE16DIO;
1448                 *driver_name = ME6000_NAME_DRIVER;
1449                 break;
1450
1451         case PCI_DEVICE_ID_MEILHAUS_ME6144:
1452                 *device_name = ME6000_NAME_DEVICE_ME61004DIO;
1453                 *device_description = ME6000_DESCRIPTION_DEVICE_ME61004DIO;
1454                 *driver_name = ME6000_NAME_DRIVER;
1455                 break;
1456
1457         case PCI_DEVICE_ID_MEILHAUS_ME6148:
1458                 *device_name = ME6000_NAME_DEVICE_ME61008DIO;
1459                 *device_description = ME6000_DESCRIPTION_DEVICE_ME61008DIO;
1460                 *driver_name = ME6000_NAME_DRIVER;
1461                 break;
1462
1463         case PCI_DEVICE_ID_MEILHAUS_ME614F:
1464                 *device_name = ME6000_NAME_DEVICE_ME610016DIO;
1465                 *device_description = ME6000_DESCRIPTION_DEVICE_ME610016DIO;
1466                 *driver_name = ME6000_NAME_DRIVER;
1467                 break;
1468
1469         case PCI_DEVICE_ID_MEILHAUS_ME6154:
1470                 *device_name = ME6000_NAME_DEVICE_ME6100I4DIO;
1471                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I4DIO;
1472                 *driver_name = ME6000_NAME_DRIVER;
1473                 break;
1474
1475         case PCI_DEVICE_ID_MEILHAUS_ME6158:
1476                 *device_name = ME6000_NAME_DEVICE_ME6100I8DIO;
1477                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I8DIO;
1478                 *driver_name = ME6000_NAME_DRIVER;
1479                 break;
1480
1481         case PCI_DEVICE_ID_MEILHAUS_ME615F:
1482                 *device_name = ME6000_NAME_DEVICE_ME6100I16DIO;
1483                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I16DIO;
1484                 *driver_name = ME6000_NAME_DRIVER;
1485                 break;
1486
1487         case PCI_DEVICE_ID_MEILHAUS_ME6174:
1488                 *device_name = ME6000_NAME_DEVICE_ME6100ISLE4DIO;
1489                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE4DIO;
1490                 *driver_name = ME6000_NAME_DRIVER;
1491                 break;
1492
1493         case PCI_DEVICE_ID_MEILHAUS_ME6178:
1494                 *device_name = ME6000_NAME_DEVICE_ME6100ISLE8DIO;
1495                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE8DIO;
1496                 *driver_name = ME6000_NAME_DRIVER;
1497                 break;
1498
1499         case PCI_DEVICE_ID_MEILHAUS_ME617F:
1500                 *device_name = ME6000_NAME_DEVICE_ME6100ISLE16DIO;
1501                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE16DIO;
1502                 *driver_name = ME6000_NAME_DRIVER;
1503                 break;
1504
1505         case PCI_DEVICE_ID_MEILHAUS_ME6259:
1506                 *device_name = ME6000_NAME_DEVICE_ME6200I9DIO;
1507                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6200I9DIO;
1508                 *driver_name = ME6000_NAME_DRIVER;
1509                 break;
1510
1511         case PCI_DEVICE_ID_MEILHAUS_ME6359:
1512                 *device_name = ME6000_NAME_DEVICE_ME6300I9DIO;
1513                 *device_description = ME6000_DESCRIPTION_DEVICE_ME6300I9DIO;
1514                 *driver_name = ME6000_NAME_DRIVER;
1515                 break;
1516
1517         case PCI_DEVICE_ID_MEILHAUS_ME0630:
1518                 *device_name = ME0600_NAME_DEVICE_ME0630;
1519                 *device_description = ME0600_DESCRIPTION_DEVICE_ME0630;
1520                 *driver_name = ME0600_NAME_DRIVER;
1521                 break;
1522
1523         case PCI_DEVICE_ID_MEILHAUS_ME8100_A:
1524                 *device_name = ME8100_NAME_DEVICE_ME8100A;
1525                 *device_description = ME8100_DESCRIPTION_DEVICE_ME8100A;
1526                 *driver_name = ME8100_NAME_DRIVER;
1527                 break;
1528
1529         case PCI_DEVICE_ID_MEILHAUS_ME8100_B:
1530                 *device_name = ME8100_NAME_DEVICE_ME8100B;
1531                 *device_description = ME8100_DESCRIPTION_DEVICE_ME8100B;
1532                 *driver_name = ME8100_NAME_DRIVER;
1533                 break;
1534
1535         case PCI_DEVICE_ID_MEILHAUS_ME8200_A:
1536                 *device_name = ME8200_NAME_DEVICE_ME8200A;
1537                 *device_description = ME8200_DESCRIPTION_DEVICE_ME8200A;
1538                 *driver_name = ME8200_NAME_DRIVER;
1539                 break;
1540
1541         case PCI_DEVICE_ID_MEILHAUS_ME8200_B:
1542                 *device_name = ME8200_NAME_DEVICE_ME8200B;
1543                 *device_description = ME8200_DESCRIPTION_DEVICE_ME8200B;
1544                 *driver_name = ME8200_NAME_DRIVER;
1545                 break;
1546
1547         case PCI_DEVICE_ID_MEILHAUS_ME0940:
1548                 *device_name = ME0900_NAME_DEVICE_ME0940;
1549                 *device_description = ME0900_DESCRIPTION_DEVICE_ME0940;
1550                 *driver_name = ME0900_NAME_DRIVER;
1551                 break;
1552
1553         case PCI_DEVICE_ID_MEILHAUS_ME0950:
1554                 *device_name = ME0900_NAME_DEVICE_ME0950;
1555                 *device_description = ME0900_DESCRIPTION_DEVICE_ME0950;
1556                 *driver_name = ME0900_NAME_DRIVER;
1557                 break;
1558
1559         case PCI_DEVICE_ID_MEILHAUS_ME0960:
1560                 *device_name = ME0900_NAME_DEVICE_ME0960;
1561                 *device_description = ME0900_DESCRIPTION_DEVICE_ME0960;
1562                 *driver_name = ME0900_NAME_DRIVER;
1563                 break;
1564 /*
1565                 case USB_DEVICE_ID_MEPHISTO_S1:
1566                         *device_name = MEPHISTO_S1_NAME_DEVICE;
1567                         *device_description = MEPHISTO_S1_DESCRIPTION_DEVICE;
1568                         *driver_name = MEPHISTO_S1_NAME_DRIVER;
1569                         break;
1570 */
1571         default:
1572                 *device_name = EMPTY_NAME_DEVICE;
1573                 *device_description = EMPTY_DESCRIPTION_DEVICE;
1574                 *driver_name = EMPTY_NAME_DRIVER;
1575
1576                 PERROR("Invalid device id.\n");
1577
1578                 return 1;
1579         }
1580
1581         return 0;
1582 }
1583
1584 int me_device_pci_init(me_device_t * me_device, struct pci_dev *pci_device)
1585 {
1586         int err;
1587         int i;
1588
1589         PDEBUG("executed.\n");
1590
1591         // Initialize device list head.
1592         INIT_LIST_HEAD(&me_device->list);
1593
1594         // Initialize device description strings.
1595         err = get_device_descriptions(pci_device->device,
1596                                       &me_device->device_name,
1597                                       &me_device->device_description,
1598                                       &me_device->driver_name);
1599
1600         if (err) {
1601                 PERROR("Cannot initialize device description strings.\n");
1602                 return 1;
1603         }
1604         // Enable the pci device.
1605         err = pci_enable_device(pci_device);
1606
1607         if (err < 0) {
1608                 PERROR("Cannot enable PCI device.\n");
1609                 return 1;
1610         }
1611         // Request the PCI register regions.
1612         err = pci_request_regions(pci_device, me_device->device_name);
1613
1614         if (err < 0) {
1615                 PERROR("Cannot request PCI regions.\n");
1616                 goto ERROR_0;
1617         }
1618         // The bus carrying the device is a PCI bus.
1619         me_device->bus_type = ME_BUS_TYPE_PCI;
1620
1621         // Store the PCI information for later usage.
1622         me_device->info.pci.pci_device = pci_device;
1623
1624         // Get PCI register bases and sizes.
1625         for (i = 0; i < 6; i++) {
1626                 me_device->info.pci.reg_bases[i] =
1627                     pci_resource_start(pci_device, i);
1628                 me_device->info.pci.reg_sizes[i] =
1629                     pci_resource_len(pci_device, i);
1630         }
1631
1632         // Get the PCI location.
1633         me_device->info.pci.pci_bus_no = pci_device->bus->number;
1634         me_device->info.pci.pci_dev_no = PCI_SLOT(pci_device->devfn);
1635         me_device->info.pci.pci_func_no = PCI_FUNC(pci_device->devfn);
1636
1637         // Get Meilhaus specific device information.
1638         me_device->info.pci.vendor_id = pci_device->vendor;
1639         me_device->info.pci.device_id = pci_device->device;
1640         pci_read_config_byte(pci_device, 0x08,
1641                              &me_device->info.pci.hw_revision);
1642         pci_read_config_dword(pci_device, 0x2C, &me_device->info.pci.serial_no);
1643
1644         // Get the interrupt request number.
1645         me_device->irq = pci_device->irq;
1646
1647         // Initialize device lock instance.
1648         err = me_dlock_init(&me_device->dlock);
1649
1650         if (err) {
1651                 PERROR("Cannot initialize device lock instance.\n");
1652                 goto ERROR_1;
1653         }
1654         // Initialize subdevice list instance.
1655         me_slist_init(&me_device->slist);
1656
1657         if (err) {
1658                 PERROR("Cannot initialize subdevice list instance.\n");
1659                 goto ERROR_2;
1660         }
1661         // Initialize method pointers.
1662         me_device->me_device_io_irq_start = me_device_io_irq_start;
1663         me_device->me_device_io_irq_wait = me_device_io_irq_wait;
1664         me_device->me_device_io_irq_stop = me_device_io_irq_stop;
1665         me_device->me_device_io_reset_device = me_device_io_reset_device;
1666         me_device->me_device_io_reset_subdevice = me_device_io_reset_subdevice;
1667         me_device->me_device_io_single_config = me_device_io_single_config;
1668         me_device->me_device_io_single_read = me_device_io_single_read;
1669         me_device->me_device_io_single_write = me_device_io_single_write;
1670         me_device->me_device_io_stream_config = me_device_io_stream_config;
1671         me_device->me_device_io_stream_new_values =
1672             me_device_io_stream_new_values;
1673         me_device->me_device_io_stream_read = me_device_io_stream_read;
1674         me_device->me_device_io_stream_start = me_device_io_stream_start;
1675         me_device->me_device_io_stream_status = me_device_io_stream_status;
1676         me_device->me_device_io_stream_stop = me_device_io_stream_stop;
1677         me_device->me_device_io_stream_write = me_device_io_stream_write;
1678         me_device->me_device_lock_device = me_device_lock_device;
1679         me_device->me_device_lock_subdevice = me_device_lock_subdevice;
1680         me_device->me_device_query_description_device =
1681             me_device_query_description_device;
1682         me_device->me_device_query_info_device = me_device_query_info_device;
1683         me_device->me_device_query_name_device = me_device_query_name_device;
1684         me_device->me_device_query_name_device_driver =
1685             me_device_query_name_device_driver;
1686         me_device->me_device_query_number_subdevices =
1687             me_device_query_number_subdevices;
1688         me_device->me_device_query_number_channels =
1689             me_device_query_number_channels;
1690         me_device->me_device_query_number_ranges =
1691             me_device_query_number_ranges;
1692         me_device->me_device_query_range_by_min_max =
1693             me_device_query_range_by_min_max;
1694         me_device->me_device_query_range_info = me_device_query_range_info;
1695         me_device->me_device_query_subdevice_by_type =
1696             me_device_query_subdevice_by_type;
1697         me_device->me_device_query_subdevice_type =
1698             me_device_query_subdevice_type;
1699         me_device->me_device_query_subdevice_caps =
1700             me_device_query_subdevice_caps;
1701         me_device->me_device_query_subdevice_caps_args =
1702             me_device_query_subdevice_caps_args;
1703         me_device->me_device_query_timer = me_device_query_timer;
1704         me_device->me_device_query_version_device_driver =
1705             me_device_query_version_device_driver;
1706         me_device->me_device_config_load = me_device_config_load;
1707         me_device->me_device_destructor = me_device_destructor;
1708
1709         return 0;
1710
1711       ERROR_0:
1712         me_dlock_deinit(&me_device->dlock);
1713
1714       ERROR_1:
1715         pci_release_regions(pci_device);
1716
1717       ERROR_2:
1718         pci_disable_device(pci_device);
1719
1720         return 1;
1721 }
1722
1723 void me_device_deinit(me_device_t * me_device)
1724 {
1725         PDEBUG("executed.\n");
1726
1727         me_slist_deinit(&me_device->slist);
1728         me_dlock_deinit(&me_device->dlock);
1729
1730         if (me_device->bus_type == ME_BUS_TYPE_PCI) {
1731                 pci_release_regions(me_device->info.pci.pci_device);
1732                 pci_disable_device(me_device->info.pci.pci_device);
1733         }
1734 /*
1735         else
1736         {
1737                 // Must be an USB device.
1738         }
1739 */
1740 }